Android面試基礎(chǔ)

1、 Android中四大組件及其作用?

  1. 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(重啟)。

  2. Service:Service是一種程序,它可以運(yùn)行很長(zhǎng)的時(shí)間,相當(dāng)于后臺(tái)的一個(gè)服務(wù),通過startService(Intent service)可以啟動(dòng)一個(gè)Service,通過Context.bindService()可以綁定一個(gè)Service。

  3. 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)用程序。

  4. Content provider:內(nèi)容提供者,可通過它來(lái)共享自己的數(shù)據(jù)給外部調(diào)用,給第三方應(yīng)用提供數(shù)據(jù)訪問的接口。

2、ListView的優(yōu)化方案?

  1. tem布局,層級(jí)越少越好,使用hierarchyview工具查看優(yōu)化。
  2. 復(fù)用convertView
  3. 使用ViewHolder
  4. item中有圖片時(shí),異步加載
  5. 快速滑動(dòng)時(shí),不加載圖片
  6. item中有圖片時(shí),應(yīng)對(duì)圖片進(jìn)行適當(dāng)壓縮
  7. 實(shí)現(xiàn)數(shù)據(jù)的分頁(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í)。

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文件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容