1、 Android中四大組件及其作用?
Activity:activity是用戶和應(yīng)用程序交互的窗口,一個(gè)activity相當(dāng)于我們實(shí)際中的一個(gè)網(wǎng)頁(yè),當(dāng)打開一個(gè)屏幕時(shí),之前的那一個(gè)屏幕會(huì)被置為暫停狀態(tài),并且壓入歷史堆棧中,用戶可以通過回退操作返回到以前打開過的屏幕。activity的生命周期:即“產(chǎn)生、運(yùn)行、銷毀”,但是這其中會(huì)調(diào)用許多方法onCreate(創(chuàng)建) 、onStart(激活)、onResume(恢復(fù))、onPause(暫停)、onStop(停止)、onDestroy(銷毀)、onRestart(重啟)。
Service:Service是一種程序,它可以運(yùn)行很長(zhǎng)的時(shí)間,相當(dāng)于后臺(tái)的一個(gè)服務(wù),通過startService(Intent service)可以啟動(dòng)一個(gè)Service,通過Context.bindService()可以綁定一個(gè)Service。
BroadCastRecevicer:接受一種或者多種Intent作觸發(fā)事件,接受相關(guān)消息,做一些簡(jiǎn)單處理,轉(zhuǎn)換成一條Notification,統(tǒng)一了Android的事件廣播模型。可以使用BroadcastReceiver來(lái)讓應(yīng)用對(duì)外一個(gè)外部的事件作出響應(yīng)。Broadcast Receiver通過NotificationManager來(lái)通知用戶這些事情發(fā)生了,BroadcastReceiver注冊(cè)的有兩種方式,一種是可以在AndroidManifest.xml中注冊(cè),另一種可以在運(yùn)行時(shí)的代碼中使用Context.registerReceiver()進(jìn)行注冊(cè)。用戶還可以通過Context.sendBroadcast()將他們自己的intent broadcasts廣播給其他的應(yīng)用程序。
Content provider:內(nèi)容提供者,可通過它來(lái)共享自己的數(shù)據(jù)給外部調(diào)用,給第三方應(yīng)用提供數(shù)據(jù)訪問的接口。
2、ListView的優(yōu)化方案?
- tem布局,層級(jí)越少越好,使用hierarchyview工具查看優(yōu)化。
- 復(fù)用convertView
- 使用ViewHolder
- item中有圖片時(shí),異步加載
- 快速滑動(dòng)時(shí),不加載圖片
- item中有圖片時(shí),應(yīng)對(duì)圖片進(jìn)行適當(dāng)壓縮
- 實(shí)現(xiàn)數(shù)據(jù)的分頁(yè)加載
如果自定義適配器,那么在getView方法中要考慮方法傳進(jìn)來(lái)的參數(shù)contentView是否為null,如果為null就創(chuàng)建contentView并返回,如果不為null則直接使用。在這個(gè)方法中盡可能少創(chuàng)建view。
給contentView設(shè)置tag(setTag()),傳入一個(gè)viewHolder對(duì)象, 用于緩存要顯示的數(shù)據(jù),可以達(dá)到圖像數(shù)據(jù)異步加載的效果。
如果listview需要顯示的item很多,就要考慮分頁(yè)加載。比如一共要 顯示100條或者更多的時(shí)候,我們可以考慮先加載20條,等用戶拉到列表 底部的時(shí)候再去加載接下來(lái)的20條。分頁(yè)加載還沒學(xué)習(xí)。
3、Android中五種數(shù)據(jù)存儲(chǔ)方式分別是什么?他們的特點(diǎn)?
Android提供了五種存取數(shù)據(jù)的方式
(1)SharedPreference,存放較少的五種類型的數(shù)據(jù),只能在同一個(gè)包內(nèi)使
用,生成XML的格式存放在設(shè)備中
(2) SQLite數(shù)據(jù)庫(kù),存放各種數(shù)據(jù),是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)
(3) File文件,通過讀取寫入方式生成文件存放數(shù)據(jù)
(4) ContentProvider,主要用于讓其他應(yīng)用程序使用保存的數(shù)據(jù)
(5)通過網(wǎng)絡(luò)獲取數(shù)據(jù)和寫入數(shù)據(jù)到網(wǎng)絡(luò)存儲(chǔ)空間
4、列舉Android中的主要五種常用布局?
最常用的布局有以下這幾種:
第一種:幀布局(框架布局)FrameLayout
第二種:線性布局LinearLayout
第三種:絕對(duì)布局AbsoluteLayout
第四種:相對(duì)布局RelativeLayout
第五種:表格布局TableLayout
5、敘述學(xué)過的系統(tǒng)提供的Adapter?說明自定義Adapter與系統(tǒng)Adapter的區(qū)別?
采用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統(tǒng)自帶的適配器,對(duì)于事件的響應(yīng)只能局限在一個(gè)行單位。 假設(shè)一行里面有一個(gè)按鈕控件,它們之間的響應(yīng)操作是不一樣的。若采用系統(tǒng)自帶的適配器,就不能精確到每個(gè)控件的響應(yīng)事件。這時(shí),我們一般采取自定義適配器來(lái)實(shí)現(xiàn)這個(gè)比較精確地請(qǐng)求。
6、Android中asset文件夾和raw文件夾區(qū)別?
res/raw和assets的相同點(diǎn):
兩者目錄下的文件在打包后會(huì)原封不動(dòng)的保存在apk包中,不會(huì)被編譯成二進(jìn)制。
res/raw和assets的不同點(diǎn):
(1)res/raw中的文件會(huì)被映射到R.Java文件中,訪問的時(shí)候直接使用資源ID即 R.raw.filename;assets文件夾下的文件不會(huì)被映射到R.java中,訪問的時(shí)候需要AssetManager類。
(2)res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),也就是assets目錄下可以再建立文件夾
(3)讀取文件資源舉例:
讀取res/raw下的文件資源,通過以下方式獲取輸入流來(lái)進(jìn)行寫操作
InputStream is = getResources().openRawResource(R.raw.filename);
讀取assets下的文件資源,通過以下方式獲取輸入流來(lái)進(jìn)行寫操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open(“filename”);
7、顯式Intent和隱式Intent區(qū)別?
Intent是一種在不同組件之間傳遞的請(qǐng)求消息,是應(yīng)用程序發(fā)出的請(qǐng)求和意圖。對(duì)于明確指出了目標(biāo)組件名稱的Intent,我們稱之為顯式Intent。對(duì)于沒有明確指出目標(biāo)組件名稱的Intent,則稱之為隱式Intent。Android系統(tǒng)使用IntentFilter 來(lái)尋找與隱式Intent相關(guān)的對(duì)象。
顯式Intent直接用組件的名稱定義目標(biāo)組件,這種方式很直接。但是由于開發(fā)人員往往并不清楚別的應(yīng)用程序的組件名稱,因此,顯式Intent更多用于在應(yīng)用程序內(nèi)部傳遞消息。比如在某應(yīng)用程序內(nèi),一個(gè)Activity啟動(dòng)一個(gè)Service。
隱式Intent恰恰相反,它不會(huì)用組件名稱定義需要激活的目標(biāo)組件,它更廣泛地用于在不同應(yīng)用程序之間傳遞消息。
8、簡(jiǎn)要描述AIDL的實(shí)現(xiàn)步驟?
服務(wù)器端:
1:服務(wù)器端寫AIDL
2:服務(wù)器端繼承Service,重寫3個(gè)方法
3:服務(wù)器端實(shí)例化一個(gè)AIDL定義接口的Stub對(duì)象,并實(shí)現(xiàn)接口的抽象方法;
4:配置文件
客戶端:
1:拷貝AIDL文件
2:綁定與Service端的服務(wù)
3:實(shí)現(xiàn)ServiceConnection,在實(shí)現(xiàn)的過程中通過Service端傳遞過來(lái)的IBinder得到Stub對(duì)象;例如:接口名.Stub.asInterface(service);
4:通過Stub對(duì)象調(diào)用相應(yīng)方法
9、 談?wù)凷ervice的生命周期,以及兩種方式的區(qū)別?
Service的生命周期由使用Service兩種方式?jīng)Q定,啟動(dòng)方式不同生命周期不同。
(1)Start方式啟動(dòng)Service的生命周期:
onCreate()—onStartCommond()—onDestroy()
調(diào)用者和服務(wù)之間沒有任何的聯(lián)系,即使調(diào)用者退出,那么服務(wù)也仍然進(jìn)行。
(2)Bind方式啟動(dòng)Service的生命周期:onCreate()->onBind()->–>onUnbind() -> onDestroy()
調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出,服務(wù)即便退出。
10、 敘述學(xué)過的系統(tǒng)提供的Adapter(說明自定義Adapter與系統(tǒng)Adapter的區(qū)別)?
采用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統(tǒng)自帶的適配器,對(duì)于事件的響應(yīng)只能局限在一個(gè)行單位。假設(shè)一行里面有一個(gè)按鈕控件,它們之間的響應(yīng)操作是不一樣的。若采用系統(tǒng)自帶的適配器,就不能精確到每個(gè)控件的響應(yīng)事件。這時(shí),我們一般采取自定義適配器來(lái)實(shí)現(xiàn)這個(gè)比較精確地請(qǐng)求。
11、寫出ListView優(yōu)化的代碼,已知自定義ListView中自定義布局文件為list_item.xml里面有ImageView和TextView兩個(gè)組件,其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內(nèi)容的基本步驟 ?
第一:得到ContentResolver類對(duì)象
ContentResolver cr=getContentResolver();
第二:定義要查詢的字段String數(shù)組
第三:使用cr.query();返回一個(gè)Cursor對(duì)象
第四:使用while循環(huán)得到Cursor里面的內(nèi)容
13、 描述一下自定義ContentProvider的步驟。
自定義contentprovider步驟
1)繼承Android的ContentProvider基類實(shí)現(xiàn)自己的ContentProvider類。
2)實(shí)現(xiàn) ContentProvider里的onCreate方法,創(chuàng)建provider的數(shù)據(jù),一般為數(shù)據(jù)庫(kù)sqlite,那么我們?cè)趏nCreate里實(shí)例化一個(gè)SqliteOpenHelper。
3)在ContentProvider 里面重寫insert/delete/update/query增刪改查這些方法。在每個(gè)方法里面實(shí)現(xiàn)相應(yīng)的功能。
4)在AndroidManifest.xml文件中注冊(cè)該ContentProvider類,為ContentProvider指定Uri。
14、 如何實(shí)現(xiàn)一個(gè)幀動(dòng)畫?
在布局文件中添加ImageView組件,設(shè)置background為res/anim/fram.xml動(dòng)畫效果
通過ImageView對(duì)象的getBackground()方法得到AnimationDrawable對(duì)象
通過AnimationDrawable對(duì)象的start()來(lái)啟動(dòng)幀動(dòng)畫,stop()來(lái)停止動(dòng)畫
15、 res/raw與assets目錄的區(qū)別?
相同點(diǎn):
兩者都會(huì)原封不動(dòng)的保存在apk包中,不會(huì)被編譯成二進(jìn)制碼。
不同點(diǎn):
1、raw目錄下只能存放文件,不能存放下一級(jí)的文件夾,而assets可以存放下一級(jí)的文件夾。
2、raw目錄下的資源會(huì)映射到R.java中生成資源id。而assets不會(huì)。
3、獲得資源的方法不同。代碼如下:
this.getAssets().open(“xml/channels.xml”)
this.getResources().openRawResource(R.raw.students)
this.getClassLoader().getResourceAsStream(“student.xml”)
16、 簡(jiǎn)述Handler機(jī)制原理?
Andriod提供了 Handler 和 Looper 來(lái)滿足線程間的通信。
Android不允許UI線程之外的線程改變UI組件的值,所以要想在其他線程里面改變UI組件的值,必須使用Handler來(lái)實(shí)現(xiàn)。
Looper: 一個(gè)線程可以產(chǎn)生一個(gè)Looper對(duì)象,由它來(lái)管理此線程里的Message Queue(消息隊(duì)列)。
Handler: 你可以構(gòu)造Handler對(duì)象來(lái)與Looper溝通,以便push(上傳)新消息到Message Queue里;或者接收Looper從Message Queue取出的消息。
Message Queue(消息隊(duì)列,特點(diǎn):先進(jìn)先出):用來(lái)存放線程放入的消息。
線程:UI thread 通常就是main thread,而Android啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)Message Queue。
Handler、Looper、MessageQueue的初始化流程如下所示。
Hander持有對(duì)UI主線程消息隊(duì)列UI_MQ和消息循環(huán)Looper的引用,子線程可以通過Handler將消息發(fā)送到UI線程的消息隊(duì)列UI_MQ中。
Handler處理消息
UI主線程通過Looper循環(huán)查詢消息隊(duì)列UI_MQ,當(dāng)發(fā)現(xiàn)有消息存在時(shí)會(huì)將消息從消息隊(duì)列中取出。首先分析消息,通過消息的參數(shù)判斷該消息對(duì)應(yīng)的Handler,然后將消息分發(fā)到指定的Handler進(jìn)行處理。
17、在android中如何使用SqliteOpenHelper?
1、建立一個(gè)類繼承SqliteOpenHelper,聲明一個(gè)構(gòu)造方法,參數(shù)包括(Context,name,CursorFactory,version);創(chuàng)建數(shù)據(jù)庫(kù)
2、實(shí)現(xiàn)其oncreate() 創(chuàng)建表
3:通過onupgrade() 版本號(hào)更新時(shí)執(zhí)行;
4、實(shí)例化所建類對(duì)象,對(duì)其進(jìn)行讀寫操作,執(zhí)行sql語(yǔ)句創(chuàng)建數(shù)據(jù)庫(kù)(當(dāng)對(duì)其使用讀寫時(shí)會(huì)判斷數(shù)據(jù)庫(kù)是否存在,如果存在,則不執(zhí)行oncreate,不存在則執(zhí)行)。
18、使用SqliteOpenHelper和SqliteDatabase進(jìn)行增刪改查具體的方法和參數(shù)?
1、通過SqliteOpenHelper得到SqliteDataBase的實(shí)例化對(duì)象(分為讀寫兩種);
2、調(diào)用execSQL()執(zhí)行增刪改的SQL語(yǔ)句,傳入SQL語(yǔ)句及需要填充的參數(shù);
調(diào)用Cursor cursor = rawQuery()執(zhí)行查詢的語(yǔ)句
3、對(duì)執(zhí)行SQL語(yǔ)句返回的游標(biāo),進(jìn)行遍歷;
4、及時(shí)關(guān)閉SqliteDataBase。
19、Sqlite和sharedPreference的區(qū)別
(1)Sqlite是嵌入式SQL數(shù)據(jù)庫(kù)引擎SQLite(SQLite Embeddable SQL Database Engine)的一個(gè)擴(kuò)展。SQLite是一個(gè)實(shí)現(xiàn)嵌入式SQL數(shù)據(jù)庫(kù)引擎的 C語(yǔ)言庫(kù)(C library)。用SQLite連接的程序可以使用SQL數(shù)據(jù)庫(kù),但不需要運(yùn)行一個(gè)單獨(dú)的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)程(separate RDBMS process)。SQLite直接讀寫(reads and writes directly)在硬盤上的數(shù)據(jù)庫(kù)文件。
(2)SharedPreferences也是一種輕型的數(shù)據(jù)存儲(chǔ)方式,它的本質(zhì)是基于XML文件存儲(chǔ)key-value鍵值對(duì)數(shù)據(jù),通常用來(lái)存儲(chǔ)一些簡(jiǎn)單的配置信息。其存儲(chǔ)位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對(duì)象本身只能獲取數(shù)據(jù)而不支持存儲(chǔ)和修改,存儲(chǔ)修改是通過Editor對(duì)象實(shí)現(xiàn)。
20、為什么要用ContentProvider?它與sql在實(shí)現(xiàn)上有何區(qū)別
Sql只能在該工程的內(nèi)部共享數(shù)據(jù),ContentProvider能在工程之間實(shí)現(xiàn)數(shù)據(jù)共享。
21、描述ContentProvider URI有哪幾部分組成
URI由是部分組成:
content://com.example.transportation/trains/122
A,標(biāo)準(zhǔn)的前綴: ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定, scheme為:content://
B,唯一標(biāo)識(shí)整個(gè)Content Provider: 主機(jī)名(或叫Authority)用于唯一標(biāo)識(shí)這個(gè)ContentProvider,外部調(diào)用者可以根據(jù)這個(gè)標(biāo)識(shí)來(lái)找到它。
C,描述了數(shù)據(jù)的路徑,確定返回哪類數(shù)據(jù): 路徑(path)可以用來(lái)表示我們要操作的數(shù)據(jù),路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定
D,ID唯一標(biāo)注請(qǐng)求的數(shù)據(jù): 我們要請(qǐng)求數(shù)據(jù)的ID
22、如何通過contentResolver掃描sdcard所有多媒體文件?
1) 通過ContentResolver訪問系統(tǒng)多媒體提供的ContentProvider,得到多媒體音樂的cursor
2) 解析cursor,通過cursor得到對(duì)應(yīng)文件列表
3) 設(shè)置listView,根據(jù)格式不同展示不同圖片,進(jìn)行使用
23、.描述一下開發(fā)ContentProvider的步驟
自定義contentprovider步驟
繼承Android的ContentProvider基類實(shí)現(xiàn)自己的ContentProvider類。
實(shí)現(xiàn) ContentProvider里的onCreate方法,創(chuàng)建provider的數(shù)據(jù),一般為數(shù)據(jù)庫(kù)sqlite,那么我們?cè)趏nCreate里實(shí)例化一個(gè)SqliteOpenHelper。
在ContentProvider 里面重寫insert/delete/update/query增刪改查這些方法。在每個(gè)方法里面實(shí)現(xiàn)相應(yīng)的功能。
在AndroidManifest.xml文件中注冊(cè)該ContentProvider類,為ContentProvider指定Uri。
24、.Android中如何訪問自定義ContentProvider?
1:得到ContentResolver類對(duì)象:ContentResolver cr = getContentResolver();
2:定義要查詢的字段String數(shù)組。
3:使用cr.query(URI,字段數(shù)組,null, null,null);,返回一個(gè)Cursor對(duì)象。
4:使用while循環(huán)得到Cursor里面的內(nèi)容。
25、 Android中五種數(shù)據(jù)存儲(chǔ)方式分別是什么?他們的特點(diǎn)?
Android提供了五種存取數(shù)據(jù)的方式
(1)SharedPreference,存放較少的五種類型的數(shù)據(jù),只能在同一個(gè)包內(nèi)使用,生成XML的格式存放在設(shè)備中
(2) SQLite數(shù)據(jù)庫(kù),存放各種數(shù)據(jù),是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)
(3) File文件,通過讀取寫入方式生成文件存放數(shù)據(jù)
(4) ContentProvider,主要用于讓其他應(yīng)用程序使用保存的數(shù)據(jù)
(5)通過網(wǎng)絡(luò)獲取數(shù)據(jù)和寫入數(shù)據(jù)到網(wǎng)絡(luò)存儲(chǔ)空間
26、 android中的動(dòng)畫有哪幾類,它們的特點(diǎn)和區(qū)別是什么?
Android中動(dòng)畫可以分為兩大類:幀動(dòng)畫、補(bǔ)間動(dòng)畫
1)補(bǔ)間動(dòng)畫:(你定義一個(gè)開始和結(jié)束,中間的部分由程序運(yùn)算得到。就是對(duì)場(chǎng)景里的對(duì)象不斷的進(jìn)行圖像變化來(lái)產(chǎn)生動(dòng)畫效果(旋轉(zhuǎn)、平移、放縮和漸變))AlphaAnimation(漸變型動(dòng)畫)、scaleAnimation(縮放型動(dòng)畫)、 TranslateAnimation(平移型動(dòng)畫)、 RotateAnimation(旋轉(zhuǎn)型動(dòng)畫)、
2)逐幀動(dòng)畫:Frame(把一連串的圖片進(jìn)行系列化連續(xù)播放,如同放電影的效果),它是通過播放一張一張圖片來(lái)達(dá)到動(dòng)畫的效果;
27、、 補(bǔ)間動(dòng)畫的兩種實(shí)現(xiàn)方式(四種可選擇一種來(lái)舉例)
1、XML配置:
1)在res/anim文件夾下配置動(dòng)畫對(duì)應(yīng)標(biāo)簽,配置對(duì)應(yīng)參數(shù),包含初始值,動(dòng)畫結(jié)束值,以及動(dòng)畫時(shí)間
2)通過AnimationUtils.loadAnimation加載XML動(dòng)畫文件
3)調(diào)用startAnimation方法開啟動(dòng)畫
2、代碼實(shí)現(xiàn):
1)直接New出需要的補(bǔ)間動(dòng)畫的對(duì)象,傳遞相應(yīng)的參數(shù)
2)調(diào)用startAnimation方法開啟動(dòng)畫
28、 如何用MediaPlayer實(shí)現(xiàn)音頻播放功能,音樂播放器的開發(fā)需注意什么?
用MediaPlayer實(shí)現(xiàn)音頻播放功能主要有兩種方法。
(方法一):在res下建立一個(gè)raw包,把文件放入包中。在activity中聲明
一個(gè)MediaPlayer對(duì)象,然后onCreate()方法中用
MediaPlayer.create(context,R.raw.資源名)方法實(shí)例化該對(duì)象。然后調(diào)用
MediaPlayer的start()、pause()和stop()方法進(jìn)行開始、暫停和停止的
操作。最后在activity的onDestroy()中調(diào)用MediaPlayer的release()
方法進(jìn)行資源的釋放。此方法的缺點(diǎn)是每次運(yùn)行程序時(shí)都要加載raw里的資
源文件,使安裝過程速度減慢。
(方法二):資源放在sdcard中。在activity中聲明一個(gè)MediaPlayer對(duì)象, 實(shí)例化 MediaPlayer()。使用Environment.
getExternalStorageDirectory().getAbsolutePath()方法獲得path,然后path+=File.separator+資源名或”包名/資源名”。然后調(diào)用MediaPlayer的setDataSource(path)進(jìn)行資源設(shè)置。然后先調(diào)用prepare()方法,在后再調(diào)用start()方法播放,調(diào)用pause()方法和stop()方法進(jìn)行暫停和停止的操作。最后在activity的onDestroy()中用release()方法進(jìn)行資源的釋放。
注意事項(xiàng),使用方法二時(shí),設(shè)置完資源路徑后要先調(diào)用prepare()方法,調(diào)
用start()、pause()、stop()方法前腰先進(jìn)行一些判斷,不然一次性調(diào)用
多次同樣的方法容易出錯(cuò)。調(diào)用stop()后在調(diào)用start()方法時(shí)要先調(diào)用prepare()方法。
29、 Android中播放小的音樂文件soundpool如何使用?
SoundPlayer 播放音頻的實(shí)現(xiàn)步驟:
1) new出一個(gè)實(shí)例 ; new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一個(gè)參數(shù)是允許有多少個(gè)聲音流同時(shí)播放,第2個(gè)參數(shù)是聲音類型,第三個(gè)參數(shù)是聲音的品質(zhì);
2) loadId = soundPool.load(context, R.raw.himi_ogg, 1);
3) 使用實(shí)例調(diào)用play方法傳入對(duì)應(yīng)的音頻文件id即可
30、 Android中視頻播放的三種方式?
1、系統(tǒng)自帶android視頻播放(最簡(jiǎn)單的視頻播放器)
1) new Intent,配置隱式意圖
2) 通過Uri.parse獲取指定文件Uri
3) 給Intent添加Uri及type
4) 啟動(dòng)Intent
2、VideoView android提供給我們的一個(gè)供我們進(jìn)行視頻播放的組件
VideoView 是android 系統(tǒng)提供的一個(gè)媒體播放顯示和控制的控件。
若需要控制欄,需要加上MediaController
3、surfaceView+MediaPlayer
1) 構(gòu)建surfaceView
2) 獲取surfaceHolder,設(shè)置分辨率
3) 對(duì)surfaceHolder添加回調(diào)接口(SurfaceHolder.Callback ) surfaceHolder.addCallback(this);
4) 實(shí)現(xiàn)接口內(nèi)部三個(gè)方法
(surfaceCreated ,surfaceChanged,surfaceDestroyed等),對(duì)Mediaplayer添加Display(控制管理器)
5) 對(duì)按鈕添加點(diǎn)擊事件
31、 Timer及AlertManager
Timer是在一個(gè)應(yīng)用運(yùn)行期間進(jìn)行的定時(shí)操作,當(dāng)應(yīng)用退出則定時(shí)操作也同時(shí)被取消。
AlarmManager是系統(tǒng)級(jí)的定時(shí)器,主要用來(lái)對(duì)Activity,Service,
BroadCastReciver三大組件進(jìn)行定時(shí)的操作,當(dāng)應(yīng)用退出后這個(gè)定時(shí)操作仍然可以按時(shí)進(jìn)行,并且通過使用可喚醒的參數(shù)可以達(dá)到在系統(tǒng)休眠狀態(tài)下仍可以完成定時(shí)操作。
32、Android中拍照功能如何實(shí)現(xiàn)?
有兩種方法實(shí)現(xiàn)拍照功能:
1、通過camera打開照相機(jī)進(jìn)行拍照調(diào)用系統(tǒng)camera執(zhí)行拍照:
1)、首先創(chuàng)建surfaceView
2)、得到surfaceView對(duì)應(yīng)控制器,并添加surfaceView的回調(diào)事件(surfaceView創(chuàng)建以及銷毀分別執(zhí)行的操作,當(dāng)surfaceView創(chuàng)建時(shí),初始化camera,當(dāng)surfaceView銷毀時(shí),釋放camera的資源)
3)、設(shè)置分辨率
4)、設(shè)置不維護(hù)緩存
5) 點(diǎn)擊調(diào)用camera的takePicture傳入回調(diào)拍照的實(shí)例化PictureCallback對(duì)象
2、系統(tǒng)拍照:通過Intent啟動(dòng),設(shè)置ACTION_IMAGE_CAPTURE,startActivity開啟
33、ListView的優(yōu)化方案?
1:判斷contentView是否為null
2:使用viewHolder緩存數(shù)據(jù),實(shí)現(xiàn)一步加載
3:分頁(yè)加載:
1)如果自定義適配器,那么在getView方法中要考慮方法傳進(jìn)來(lái)的參數(shù)contentView是否為null,如果為null就創(chuàng)建contentView并返回,如果不為null則直接使用。在這個(gè)方法中盡可能少創(chuàng)建view。
2)給contentView設(shè)置tag(setTag()),傳入一個(gè)viewHolder對(duì)象,用于緩存要顯示的數(shù)據(jù),可以達(dá)到數(shù)據(jù)異步加載的效果。
3)如果listview需要顯示的item很多,就要考慮分頁(yè)加載。比如一共要顯示100條或者更多的時(shí)候,我們可以考慮先加載20條,等用戶拉到列表底部的時(shí)候再去加載接下來(lái)的20條。分頁(yè)加載還沒學(xué)習(xí)。
34、 MVC設(shè)計(jì)模式在Android中的應(yīng)用?
1.模型層(model):對(duì)數(shù)據(jù)庫(kù)操作,對(duì)網(wǎng)絡(luò)等操作都應(yīng)在model中處理,對(duì)業(yè)務(wù)的計(jì)算等操作都應(yīng)在該層。可以簡(jiǎn)單的理解為Android中的Java源文件
2.視圖層(view):一般采用XML進(jìn)行描述,使用的時(shí)候可以方便的引入,可以簡(jiǎn)單的理解為Android中Layout文件。 Android中也可以用JavaScript+HTML 等方式作為view 層。
3.控制層(controller):控制model和view的協(xié)調(diào)工作。簡(jiǎn)單的理解為Android中manifest文件。