1流酬、 Android中四大組件及其作用嗦董?
Activity:activity是用戶和應用程序交互的窗口居兆,一個activity相當于我們實際中的一個網頁,當打開一個屏幕時感混,之前的那一個屏幕會被置為暫停狀態(tài)端幼,并且壓入歷史堆棧中,用戶可以通過回退操作返回到以前打開過的屏幕弧满。activity的生命周期:即“產生婆跑、運行、銷毀”庭呜,但是這其中會調用許多方法onCreate(創(chuàng)建) 滑进、onStart(激活)、onResume(恢復)募谎、onPause(暫停)扶关、onStop(停止)、onDestroy(銷毀)数冬、onRestart(重啟)节槐。
Service:Service是一種程序,它可以運行很長的時間拐纱,相當于后臺的一個服務铜异,通過startService(Intent service)可以啟動一個Service,通過Context.bindService()可以綁定一個Service秸架。
BroadCastRecevicer:接受一種或者多種Intent作觸發(fā)事件揍庄,接受相關消息,做一些簡單處理咕宿,轉換成一條Notification币绩,統(tǒng)一了Android的事件廣播模型「В可以使用BroadcastReceiver來讓應用對外一個外部的事件作出響應缆镣。Broadcast Receiver通過NotificationManager來通知用戶這些事情發(fā)生了,BroadcastReceiver注冊的有兩種方式试浙,一種是可以在AndroidManifest.xml中注冊董瞻,另一種可以在運行時的代碼中使用Context.registerReceiver()進行注冊。用戶還可以通過Context.sendBroadcast()將他們自己的intent broadcasts廣播給其他的應用程序。
Content provider:內容提供者钠糊,可通過它來共享自己的數據給外部調用挟秤,給第三方應用提供數據訪問的接口。
2抄伍、ListView的優(yōu)化方案艘刚?
- tem布局,層級越少越好截珍,使用hierarchyview工具查看優(yōu)化攀甚。
- 復用convertView
- 使用ViewHolder
- item中有圖片時,異步加載
- 快速滑動時岗喉,不加載圖片
- item中有圖片時秋度,應對圖片進行適當壓縮
- 實現數據的分頁加載
如果自定義適配器,那么在getView方法中要考慮方法傳進來的參數contentView是否為null钱床,如果為null就創(chuàng)建contentView并返回荚斯,如果不為null則直接使用。在這個方法中盡可能少創(chuàng)建view查牌。
給contentView設置tag(setTag())事期,傳入一個viewHolder對象, 用于緩存要顯示的數據僧免,可以達到圖像數據異步加載的效果刑赶。
如果listview需要顯示的item很多,就要考慮分頁加載懂衩。比如一共要 顯示100條或者更多的時候撞叨,我們可以考慮先加載20條,等用戶拉到列表 底部的時候再去加載接下來的20條浊洞。分頁加載還沒學習牵敷。
3、Android中五種數據存儲方式分別是什么法希?他們的特點枷餐?
Android提供了五種存取數據的方式
(1)SharedPreference,存放較少的五種類型的數據苫亦,只能在同一個包內使
用毛肋,生成XML的格式存放在設備中
(2) SQLite數據庫,存放各種數據屋剑,是一個輕量級的嵌入式數據庫
(3) File文件润匙,通過讀取寫入方式生成文件存放數據
(4) ContentProvider,主要用于讓其他應用程序使用保存的數據
(5)通過網絡獲取數據和寫入數據到網絡存儲空間
4唉匾、列舉Android中的主要五種常用布局孕讳?
最常用的布局有以下這幾種:
第一種:幀布局(框架布局)FrameLayout
第二種:線性布局LinearLayout
第三種:絕對布局AbsoluteLayout
第四種:相對布局RelativeLayout
第五種:表格布局TableLayout
5、敘述學過的系統(tǒng)提供的Adapter?說明自定義Adapter與系統(tǒng)Adapter的區(qū)別厂财?
采用ArrayAdapter芋簿、SimpleAdapter和SimpleCursorAdapter這些系統(tǒng)自帶的適配器,對于事件的響應只能局限在一個行單位璃饱。 假設一行里面有一個按鈕控件与斤,它們之間的響應操作是不一樣的。若采用系統(tǒng)自帶的適配器帜平,就不能精確到每個控件的響應事件幽告。這時梅鹦,我們一般采取自定義適配器來實現這個比較精確地請求裆甩。
6、Android中asset文件夾和raw文件夾區(qū)別齐唆?
res/raw和assets的相同點:
兩者目錄下的文件在打包后會原封不動的保存在apk包中嗤栓,不會被編譯成二進制。
res/raw和assets的不同點:
(1)res/raw中的文件會被映射到R.Java文件中箍邮,訪問的時候直接使用資源ID即 R.raw.filename茉帅;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類锭弊。
(2)res/raw不可以有目錄結構堪澎,而assets則可以有目錄結構,也就是assets目錄下可以再建立文件夾
(3)讀取文件資源舉例:
讀取res/raw下的文件資源味滞,通過以下方式獲取輸入流來進行寫操作
InputStream is = getResources().openRawResource(R.raw.filename);
讀取assets下的文件資源樱蛤,通過以下方式獲取輸入流來進行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open(“filename”);
7、顯式Intent和隱式Intent區(qū)別剑鞍?
Intent是一種在不同組件之間傳遞的請求消息昨凡,是應用程序發(fā)出的請求和意圖。對于明確指出了目標組件名稱的Intent蚁署,我們稱之為顯式Intent便脊。對于沒有明確指出目標組件名稱的Intent,則稱之為隱式Intent光戈。Android系統(tǒng)使用IntentFilter 來尋找與隱式Intent相關的對象哪痰。
顯式Intent直接用組件的名稱定義目標組件,這種方式很直接久妆。但是由于開發(fā)人員往往并不清楚別的應用程序的組件名稱晌杰,因此,顯式Intent更多用于在應用程序內部傳遞消息镇饺。比如在某應用程序內乎莉,一個Activity啟動一個Service。
隱式Intent恰恰相反,它不會用組件名稱定義需要激活的目標組件惋啃,它更廣泛地用于在不同應用程序之間傳遞消息哼鬓。
8、簡要描述AIDL的實現步驟边灭?
服務器端:
1:服務器端寫AIDL
2:服務器端繼承Service异希,重寫3個方法
3:服務器端實例化一個AIDL定義接口的Stub對象,并實現接口的抽象方法绒瘦;
4:配置文件
客戶端:
1:拷貝AIDL文件
2:綁定與Service端的服務
3:實現ServiceConnection称簿,在實現的過程中通過Service端傳遞過來的IBinder得到Stub對象;例如:接口名.Stub.asInterface(service);
4:通過Stub對象調用相應方法
9惰帽、 談談Service的生命周期,以及兩種方式的區(qū)別憨降?
Service的生命周期由使用Service兩種方式決定,啟動方式不同生命周期不同该酗。
(1)Start方式啟動Service的生命周期:
onCreate()—onStartCommond()—onDestroy()
調用者和服務之間沒有任何的聯系授药,即使調用者退出,那么服務也仍然進行呜魄。
(2)Bind方式啟動Service的生命周期:onCreate()->onBind()->–>onUnbind() -> onDestroy()
調用者和服務綁定在一起悔叽,調用者退出,服務即便退出爵嗅。
10娇澎、 敘述學過的系統(tǒng)提供的Adapter(說明自定義Adapter與系統(tǒng)Adapter的區(qū)別)?
采用ArrayAdapter睹晒、SimpleAdapter和SimpleCursorAdapter這些系統(tǒng)自帶的適配器趟庄,對于事件的響應只能局限在一個行單位。假設一行里面有一個按鈕控件册招,它們之間的響應操作是不一樣的岔激。若采用系統(tǒng)自帶的適配器,就不能精確到每個控件的響應事件是掰。這時虑鼎,我們一般采取自定義適配器來實現這個比較精確地請求。
11键痛、寫出ListView優(yōu)化的代碼炫彩,已知自定義ListView中自定義布局文件為list_item.xml里面有ImageView和TextView兩個組件,其id為item_image絮短、item_text江兢。
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView==null){
viewHolder=new ViewHolder();
convertView=LayoutInflater.from(c).inflate(R.layout.list_item, null);
viewHolder.text=(TextView) convertView.findViewById(R.id.item_text);
viewHolder.image=(ImageView) convertView.findViewById(R.id.item_image);
convertView.setTag(viewHolder);
}
viewHolder=(ViewHolder) convertView.getTag();
viewHolder.text.setText(list.get(position).getText());
viewHolder.image.setImageResource(list.get(position).getImage());
return convertView;
}
static class ViewHolder{
TextView text;
ImageView image;
}
12、 描述通過contentResolver獲取ContentProvider內容的基本步驟 丁频?
第一:得到ContentResolver類對象
ContentResolver cr=getContentResolver();
第二:定義要查詢的字段String數組
第三:使用cr.query();返回一個Cursor對象
第四:使用while循環(huán)得到Cursor里面的內容
13杉允、 描述一下自定義ContentProvider的步驟邑贴。
自定義contentprovider步驟
1)繼承Android的ContentProvider基類實現自己的ContentProvider類。
2)實現 ContentProvider里的onCreate方法叔磷,創(chuàng)建provider的數據拢驾,一般為數據庫sqlite,那么我們在onCreate里實例化一個SqliteOpenHelper改基。
3)在ContentProvider 里面重寫insert/delete/update/query增刪改查這些方法繁疤。在每個方法里面實現相應的功能。
4)在AndroidManifest.xml文件中注冊該ContentProvider類秕狰,為ContentProvider指定Uri稠腊。
14、 如何實現一個幀動畫?
在布局文件中添加ImageView組件鸣哀,設置background為res/anim/fram.xml動畫效果
通過ImageView對象的getBackground()方法得到AnimationDrawable對象
通過AnimationDrawable對象的start()來啟動幀動畫架忌,stop()來停止動畫
15、 res/raw與assets目錄的區(qū)別诺舔?
相同點:
兩者都會原封不動的保存在apk包中鳖昌,不會被編譯成二進制碼。
不同點:
1低飒、raw目錄下只能存放文件,不能存放下一級的文件夾懂盐,而assets可以存放下一級的文件夾褥赊。
2、raw目錄下的資源會映射到R.java中生成資源id莉恼。而assets不會拌喉。
3、獲得資源的方法不同俐银。代碼如下:
this.getAssets().open(“xml/channels.xml”)
this.getResources().openRawResource(R.raw.students)
this.getClassLoader().getResourceAsStream(“student.xml”)
16尿背、 簡述Handler機制原理?
Andriod提供了 Handler 和 Looper 來滿足線程間的通信捶惜。
Android不允許UI線程之外的線程改變UI組件的值田藐,所以要想在其他線程里面改變UI組件的值,必須使用Handler來實現吱七。
Looper: 一個線程可以產生一個Looper對象汽久,由它來管理此線程里的Message Queue(消息隊列)。
Handler: 你可以構造Handler對象來與Looper溝通踊餐,以便push(上傳)新消息到Message Queue里;或者接收Looper從Message Queue取出的消息景醇。
Message Queue(消息隊列,特點:先進先出):用來存放線程放入的消息吝岭。
線程:UI thread 通常就是main thread三痰,而Android啟動程序時會替它建立一個Message Queue吧寺。
Handler、Looper散劫、MessageQueue的初始化流程如下所示撮执。
Hander持有對UI主線程消息隊列UI_MQ和消息循環(huán)Looper的引用,子線程可以通過Handler將消息發(fā)送到UI線程的消息隊列UI_MQ中舷丹。
Handler處理消息
UI主線程通過Looper循環(huán)查詢消息隊列UI_MQ抒钱,當發(fā)現有消息存在時會將消息從消息隊列中取出。首先分析消息颜凯,通過消息的參數判斷該消息對應的Handler谋币,然后將消息分發(fā)到指定的Handler進行處理。
17症概、在android中如何使用SqliteOpenHelper?
1蕾额、建立一個類繼承SqliteOpenHelper,聲明一個構造方法彼城,參數包括(Context,name,CursorFactory,version)诅蝶;創(chuàng)建數據庫
2、實現其oncreate() 創(chuàng)建表
3:通過onupgrade() 版本號更新時執(zhí)行募壕;
4调炬、實例化所建類對象,對其進行讀寫操作舱馅,執(zhí)行sql語句創(chuàng)建數據庫(當對其使用讀寫時會判斷數據庫是否存在缰泡,如果存在,則不執(zhí)行oncreate代嗤,不存在則執(zhí)行)棘钞。
18、使用SqliteOpenHelper和SqliteDatabase進行增刪改查具體的方法和參數干毅?
1宜猜、通過SqliteOpenHelper得到SqliteDataBase的實例化對象(分為讀寫兩種);
2硝逢、調用execSQL()執(zhí)行增刪改的SQL語句,傳入SQL語句及需要填充的參數姨拥;
調用Cursor cursor = rawQuery()執(zhí)行查詢的語句
3、對執(zhí)行SQL語句返回的游標趴捅,進行遍歷垫毙;
4、及時關閉SqliteDataBase拱绑。
19综芥、Sqlite和sharedPreference的區(qū)別
(1)Sqlite是嵌入式SQL數據庫引擎SQLite(SQLite Embeddable SQL Database Engine)的一個擴展。SQLite是一個實現嵌入式SQL數據庫引擎的 C語言庫(C library)猎拨。用SQLite連接的程序可以使用SQL數據庫膀藐,但不需要運行一個單獨的關系型數據庫管理系統(tǒng)進程(separate RDBMS process)屠阻。SQLite直接讀寫(reads and writes directly)在硬盤上的數據庫文件。
(2)SharedPreferences也是一種輕型的數據存儲方式额各,它的本質是基于XML文件存儲key-value鍵值對數據国觉,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下虾啦。SharedPreferences對象本身只能獲取數據而不支持存儲和修改麻诀,存儲修改是通過Editor對象實現。
20傲醉、為什么要用ContentProvider?它與sql在實現上有何區(qū)別
Sql只能在該工程的內部共享數據蝇闭,ContentProvider能在工程之間實現數據共享。
21硬毕、描述ContentProvider URI有哪幾部分組成
URI由是部分組成:
content://com.example.transportation/trains/122
A呻引,標準的前綴: ContentProvider(內容提供者)的scheme已經由Android所規(guī)定, scheme為:content://
B吐咳,唯一標識整個Content Provider: 主機名(或叫Authority)用于唯一標識這個ContentProvider逻悠,外部調用者可以根據這個標識來找到它。
C韭脊,描述了數據的路徑童谒,確定返回哪類數據: 路徑(path)可以用來表示我們要操作的數據,路徑的構建應根據業(yè)務而定
D乾蓬,ID唯一標注請求的數據: 我們要請求數據的ID
22惠啄、如何通過contentResolver掃描sdcard所有多媒體文件?
1) 通過ContentResolver訪問系統(tǒng)多媒體提供的ContentProvider,得到多媒體音樂的cursor
2) 解析cursor任内,通過cursor得到對應文件列表
3) 設置listView,根據格式不同展示不同圖片,進行使用
23融柬、.描述一下開發(fā)ContentProvider的步驟
自定義contentprovider步驟
繼承Android的ContentProvider基類實現自己的ContentProvider類死嗦。
實現 ContentProvider里的onCreate方法,創(chuàng)建provider的數據粒氧,一般為數據庫sqlite越除,那么我們在onCreate里實例化一個SqliteOpenHelper。
在ContentProvider 里面重寫insert/delete/update/query增刪改查這些方法外盯。在每個方法里面實現相應的功能摘盆。
在AndroidManifest.xml文件中注冊該ContentProvider類,為ContentProvider指定Uri饱苟。
24孩擂、.Android中如何訪問自定義ContentProvider?
1:得到ContentResolver類對象:ContentResolver cr = getContentResolver();
2:定義要查詢的字段String數組箱熬。
3:使用cr.query(URI,字段數組类垦,null狈邑, null,null);蚤认,返回一個Cursor對象米苹。
4:使用while循環(huán)得到Cursor里面的內容。
25砰琢、 Android中五種數據存儲方式分別是什么蘸嘶?他們的特點?
Android提供了五種存取數據的方式
(1)SharedPreference陪汽,存放較少的五種類型的數據训唱,只能在同一個包內使用,生成XML的格式存放在設備中
(2) SQLite數據庫掩缓,存放各種數據雪情,是一個輕量級的嵌入式數據庫
(3) File文件,通過讀取寫入方式生成文件存放數據
(4) ContentProvider你辣,主要用于讓其他應用程序使用保存的數據
(5)通過網絡獲取數據和寫入數據到網絡存儲空間
26巡通、 android中的動畫有哪幾類,它們的特點和區(qū)別是什么舍哄?
Android中動畫可以分為兩大類:幀動畫宴凉、補間動畫
1)補間動畫:(你定義一個開始和結束,中間的部分由程序運算得到表悬。就是對場景里的對象不斷的進行圖像變化來產生動畫效果(旋轉弥锄、平移、放縮和漸變))AlphaAnimation(漸變型動畫)蟆沫、scaleAnimation(縮放型動畫)籽暇、 TranslateAnimation(平移型動畫)、 RotateAnimation(旋轉型動畫)饭庞、
2)逐幀動畫:Frame(把一連串的圖片進行系列化連續(xù)播放戒悠,如同放電影的效果),它是通過播放一張一張圖片來達到動畫的效果舟山;
27绸狐、、 補間動畫的兩種實現方式(四種可選擇一種來舉例)
1累盗、XML配置:
1)在res/anim文件夾下配置動畫對應標簽寒矿,配置對應參數,包含初始值若债,動畫結束值符相,以及動畫時間
2)通過AnimationUtils.loadAnimation加載XML動畫文件
3)調用startAnimation方法開啟動畫
2、代碼實現:
1)直接New出需要的補間動畫的對象拆座,傳遞相應的參數
2)調用startAnimation方法開啟動畫
28主巍、 如何用MediaPlayer實現音頻播放功能冠息,音樂播放器的開發(fā)需注意什么?
用MediaPlayer實現音頻播放功能主要有兩種方法孕索。
(方法一):在res下建立一個raw包苛秕,把文件放入包中荷逞。在activity中聲明
一個MediaPlayer對象,然后onCreate()方法中用
MediaPlayer.create(context,R.raw.資源名)方法實例化該對象。然后調用
MediaPlayer的start()单鹿、pause()和stop()方法進行開始澎媒、暫停和停止的
操作钉鸯。最后在activity的onDestroy()中調用MediaPlayer的release()
方法進行資源的釋放季惯。此方法的缺點是每次運行程序時都要加載raw里的資
源文件,使安裝過程速度減慢翎嫡。
(方法二):資源放在sdcard中欠动。在activity中聲明一個MediaPlayer對象, 實例化 MediaPlayer()惑申。使用Environment.
getExternalStorageDirectory().getAbsolutePath()方法獲得path具伍,然后path+=File.separator+資源名或”包名/資源名”。然后調用MediaPlayer的setDataSource(path)進行資源設置圈驼。然后先調用prepare()方法人芽,在后再調用start()方法播放,調用pause()方法和stop()方法進行暫停和停止的操作绩脆。最后在activity的onDestroy()中用release()方法進行資源的釋放萤厅。
注意事項,使用方法二時靴迫,設置完資源路徑后要先調用prepare()方法惕味,調
用start()、pause()玉锌、stop()方法前腰先進行一些判斷赦拘,不然一次性調用
多次同樣的方法容易出錯。調用stop()后在調用start()方法時要先調用prepare()方法芬沉。
29、 Android中播放小的音樂文件soundpool如何使用阁猜?
SoundPlayer 播放音頻的實現步驟:
1) new出一個實例 ; new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一個參數是允許有多少個聲音流同時播放,第2個參數是聲音類型,第三個參數是聲音的品質;
2) loadId = soundPool.load(context, R.raw.himi_ogg, 1);
3) 使用實例調用play方法傳入對應的音頻文件id即可
30丸逸、 Android中視頻播放的三種方式?
1剃袍、系統(tǒng)自帶android視頻播放(最簡單的視頻播放器)
1) new Intent黄刚,配置隱式意圖
2) 通過Uri.parse獲取指定文件Uri
3) 給Intent添加Uri及type
4) 啟動Intent
2、VideoView android提供給我們的一個供我們進行視頻播放的組件
VideoView 是android 系統(tǒng)提供的一個媒體播放顯示和控制的控件民效。
若需要控制欄憔维,需要加上MediaController
3涛救、surfaceView+MediaPlayer
1) 構建surfaceView
2) 獲取surfaceHolder,設置分辨率
3) 對surfaceHolder添加回調接口(SurfaceHolder.Callback ) surfaceHolder.addCallback(this);
4) 實現接口內部三個方法
(surfaceCreated ,surfaceChanged,surfaceDestroyed等),對Mediaplayer添加Display(控制管理器)
5) 對按鈕添加點擊事件
31业扒、 Timer及AlertManager
Timer是在一個應用運行期間進行的定時操作检吆,當應用退出則定時操作也同時被取消。
AlarmManager是系統(tǒng)級的定時器程储,主要用來對Activity,Service,
BroadCastReciver三大組件進行定時的操作蹭沛,當應用退出后這個定時操作仍然可以按時進行,并且通過使用可喚醒的參數可以達到在系統(tǒng)休眠狀態(tài)下仍可以完成定時操作章鲤。
32摊灭、Android中拍照功能如何實現?
有兩種方法實現拍照功能:
1败徊、通過camera打開照相機進行拍照調用系統(tǒng)camera執(zhí)行拍照:
1)帚呼、首先創(chuàng)建surfaceView
2)、得到surfaceView對應控制器皱蹦,并添加surfaceView的回調事件(surfaceView創(chuàng)建以及銷毀分別執(zhí)行的操作,當surfaceView創(chuàng)建時煤杀,初始化camera,當surfaceView銷毀時,釋放camera的資源)
3)根欧、設置分辨率
4)怜珍、設置不維護緩存
5) 點擊調用camera的takePicture傳入回調拍照的實例化PictureCallback對象
2、系統(tǒng)拍照:通過Intent啟動凤粗,設置ACTION_IMAGE_CAPTURE,startActivity開啟
33酥泛、ListView的優(yōu)化方案?
1:判斷contentView是否為null
2:使用viewHolder緩存數據嫌拣,實現一步加載
3:分頁加載:
1)如果自定義適配器柔袁,那么在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創(chuàng)建contentView并返回异逐,如果不為null則直接使用捶索。在這個方法中盡可能少創(chuàng)建view。
2)給contentView設置tag(setTag())灰瞻,傳入一個viewHolder對象腥例,用于緩存要顯示的數據,可以達到數據異步加載的效果酝润。
3)如果listview需要顯示的item很多燎竖,就要考慮分頁加載。比如一共要顯示100條或者更多的時候要销,我們可以考慮先加載20條构回,等用戶拉到列表底部的時候再去加載接下來的20條。分頁加載還沒學習。
34纤掸、 MVC設計模式在Android中的應用脐供?
1.模型層(model):對數據庫操作,對網絡等操作都應在model中處理借跪,對業(yè)務的計算等操作都應在該層政己。可以簡單的理解為Android中的Java源文件
2.視圖層(view):一般采用XML進行描述垦梆,使用的時候可以方便的引入匹颤,可以簡單的理解為Android中Layout文件。 Android中也可以用JavaScript+HTML 等方式作為view 層托猩。
3.控制層(controller):控制model和view的協調工作印蓖。簡單的理解為Android中manifest文件。