Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android面試基礎

Android面試基礎

編輯:關於Android編程

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

Activity:activity是用戶和應用程序交互的窗口,一個activity相當於我們實際中的一個網頁,當打開一個屏幕時,之前的那一個屏幕會被置為暫停狀態,並且壓入歷史堆棧中,用戶可以通過回退操作返回到以前打開過的屏幕。activity的生命周期:即“產生、運行、銷毀”,但是這其中會調用許多方法onCreate(創建) 、onStart(激活)、onResume(恢復)、onPause(暫停)、onStop(停止)、onDestroy(銷毀)、onRestart(重啟)。

Service:Service是一種程序,它可以運行很長的時間,相當於後台的一個服務,通過startService(Intent service)可以啟動一個Service,通過Context.bindService()可以綁定一個Service。

BroadCastRecevicer:接受一種或者多種Intent作觸發事件,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型。可以使用BroadcastReceiver來讓應用對外一個外部的事件作出響應。Broadcast Receiver通過NotificationManager來通知用戶這些事情發生了,BroadcastReceiver注冊的有兩種方式,一種是可以在AndroidManifest.xml中注冊,另一種可以在運行時的代碼中使用Context.registerReceiver()進行注冊。用戶還可以通過Context.sendBroadcast()將他們自己的intent broadcasts廣播給其他的應用程序。

Content provider:內容提供者,可通過它來共享自己的數據給外部調用,給第三方應用提供數據訪問的接口。

2、ListView的優化方案?

如果自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView並返回,如果不為null則直接使用。在這個方法中盡可能少創建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、敘述學過的系統提供的Adapter?說明自定義Adapter與系統Adapter的區別?

采用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統自帶的適配器,對於事件的響應只能局限在一個行單位。 假設一行裡面有一個按鈕控件,它們之間的響應操作是不一樣的。若采用系統自帶的適配器,就不能精確到每個控件的響應事件。這時,我們一般采取自定義適配器來實現這個比較精確地請求。

6、Android中asset文件夾和raw文件夾區別?

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區別?

Intent是一種在不同組件之間傳遞的請求消息,是應用程序發出的請求和意圖。對於明確指出了目標組件名稱的Intent,我們稱之為顯式Intent。對於沒有明確指出目標組件名稱的Intent,則稱之為隱式Intent。Android系統使用IntentFilter 來尋找與隱式Intent相關的對象。

顯式Intent直接用組件的名稱定義目標組件,這種方式很直接。但是由於開發人員往往並不清楚別的應用程序的組件名稱,因此,顯式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的生命周期,以及兩種方式的區別?

Service的生命周期由使用Service兩種方式決定,啟動方式不同生命周期不同。

(1)Start方式啟動Service的生命周期: 
onCreate()—onStartCommond()—onDestroy() 
調用者和服務之間沒有任何的聯系,即使調用者退出,那麼服務也仍然進行。 
(2)Bind方式啟動Service的生命周期:onCreate()->onBind()->–>onUnbind() -> onDestroy() 
調用者和服務綁定在一起,調用者退出,服務即便退出。

10、 敘述學過的系統提供的Adapter(說明自定義Adapter與系統Adapter的區別)?

采用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter這些系統自帶的適配器,對於事件的響應只能局限在一個行單位。假設一行裡面有一個按鈕控件,它們之間的響應操作是不一樣的。若采用系統自帶的適配器,就不能精確到每個控件的響應事件。這時,我們一般采取自定義適配器來實現這個比較精確地請求。

11、寫出ListView優化的代碼,已知自定義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循環得到Cursor裡面的內容

13、 描述一下自定義ContentProvider的步驟。

自定義contentprovider步驟

1)繼承Android的ContentProvider基類實現自己的ContentProvider類。 
2)實現 ContentProvider裡的onCreate方法,創建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目錄的區別?

相同點:

兩者都會原封不動的保存在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和消息循環Looper的引用,子線程可以通過Handler將消息發送到UI線程的消息隊列UI_MQ中。
Handler處理消息
UI主線程通過Looper循環查詢消息隊列UI_MQ,當發現有消息存在時會將消息從消息隊列中取出。首先分析消息,通過消息的參數判斷該消息對應的Handler,然後將消息分發到指定的Handler進行處理。

17、在android中如何使用SqliteOpenHelper?

1、建立一個類繼承SqliteOpenHelper,聲明一個構造方法,參數包括(Context,name,CursorFactory,version);創建數據庫 
2、實現其oncreate() 創建表 
3:通過onupgrade() 版本號更新時執行; 
4、實例化所建類對象,對其進行讀寫操作,執行sql語句創建數據庫(當對其使用讀寫時會判斷數據庫是否存在,如果存在,則不執行oncreate,不存在則執行)。

18、使用SqliteOpenHelper和SqliteDatabase進行增刪改查具體的方法和參數?

1、通過SqliteOpenHelper得到SqliteDataBase的實例化對象(分為讀寫兩種); 
2、調用execSQL()執行增刪改的SQL語句,傳入SQL語句及需要填充的參數; 
調用Cursor cursor = rawQuery()執行查詢的語句 
3、對執行SQL語句返回的游標,進行遍歷; 
4、及時關閉SqliteDataBase。

19、Sqlite和sharedPreference的區別

(1)Sqlite是嵌入式SQL數據庫引擎SQLite(SQLite Embeddable SQL Database Engine)的一個擴展。SQLite是一個實現嵌入式SQL數據庫引擎的 C語言庫(C library)。用SQLite連接的程序可以使用SQL數據庫,但不需要運行一個單獨的關系型數據庫管理系統進程(separate RDBMS process)。SQLite直接讀寫(reads and writes directly)在硬盤上的數據庫文件。

(2)SharedPreferences也是一種輕型的數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。

20、為什麼要用ContentProvider?它與sql在實現上有何區別

Sql只能在該工程的內部共享數據,ContentProvider能在工程之間實現數據共享。

21、描述ContentProvider URI有哪幾部分組成

URI由是部分組成:
content://com.example.transportation/trains/122

A,標准的前綴: ContentProvider(內容提供者)的scheme已經由Android所規定, scheme為:content://

B,唯一標識整個Content Provider: 主機名(或叫Authority)用於唯一標識這個ContentProvider,外部調用者可以根據這個標識來找到它。

C,描述了數據的路徑,確定返回哪類數據: 路徑(path)可以用來表示我們要操作的數據,路徑的構建應根據業務而定

D,ID唯一標注請求的數據: 我們要請求數據的ID

22、如何通過contentResolver掃描sdcard所有多媒體文件?

1) 通過ContentResolver訪問系統多媒體提供的ContentProvider,得到多媒體音樂的cursor 
2) 解析cursor,通過cursor得到對應文件列表 
3) 設置listView,根據格式不同展示不同圖片,進行使用

23、.描述一下開發ContentProvider的步驟

自定義contentprovider步驟

繼承Android的ContentProvider基類實現自己的ContentProvider類。
實現 ContentProvider裡的onCreate方法,創建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循環得到Cursor裡面的內容。

25、 Android中五種數據存儲方式分別是什麼?他們的特點?

Android提供了五種存取數據的方式

(1)SharedPreference,存放較少的五種類型的數據,只能在同一個包內使用,生成XML的格式存放在設備中 
(2) SQLite數據庫,存放各種數據,是一個輕量級的嵌入式數據庫 
(3) File文件,通過讀取寫入方式生成文件存放數據 
(4) ContentProvider,主要用於讓其他應用程序使用保存的數據 
(5)通過網絡獲取數據和寫入數據到網絡存儲空間

26、 android中的動畫有哪幾類,它們的特點和區別是什麼?

Android中動畫可以分為兩大類:幀動畫、補間動畫

1)補間動畫:(你定義一個開始和結束,中間的部分由程序運算得到。就是對場景裡的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變))AlphaAnimation(漸變型動畫)、scaleAnimation(縮放型動畫)、 TranslateAnimation(平移型動畫)、 RotateAnimation(旋轉型動畫)、 
2)逐幀動畫:Frame(把一連串的圖片進行系列化連續播放,如同放電影的效果),它是通過播放一張一張圖片來達到動畫的效果;

27、、 補間動畫的兩種實現方式(四種可選擇一種來舉例)

1、XML配置:

1)在res/anim文件夾下配置動畫對應標簽,配置對應參數,包含初始值,動畫結束值,以及動畫時間 
2)通過AnimationUtils.loadAnimation加載XML動畫文件 
3)調用startAnimation方法開啟動畫 

2、代碼實現:

1)直接New出需要的補間動畫的對象,傳遞相應的參數 
2)調用startAnimation方法開啟動畫

28、 如何用MediaPlayer實現音頻播放功能,音樂播放器的開發需注意什麼?

用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、系統自帶android視頻播放(最簡單的視頻播放器)

1) new Intent,配置隱式意圖 
2) 通過Uri.parse獲取指定文件Uri 
3) 給Intent添加Uri及type 
4) 啟動Intent

2、VideoView android提供給我們的一個供我們進行視頻播放的組件

VideoView 是android 系統提供的一個媒體播放顯示和控制的控件。 
若需要控制欄,需要加上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是系統級的定時器,主要用來對Activity,Service,BroadCastReciver三大組件進行定時的操作,當應用退出後這個定時操作仍然可以按時進行,並且通過使用可喚醒的參數可以達到在系統休眠狀態下仍可以完成定時操作。

32、Android中拍照功能如何實現?

有兩種方法實現拍照功能:

1、通過camera打開照相機進行拍照調用系統camera執行拍照:

1)、首先創建surfaceView 
2)、得到surfaceView對應控制器,並添加surfaceView的回調事件(surfaceView創建以及銷毀分別執行的操作,當surfaceView創建時,初始化camera,當surfaceView銷毀時,釋放camera的資源) 
3)、設置分辨率 
4)、設置不維護緩存 
5) 點擊調用camera的takePicture傳入回調拍照的實例化PictureCallback對象 

2、系統拍照:通過Intent啟動,設置ACTION_IMAGE_CAPTURE,startActivity開啟

33、ListView的優化方案?

1:判斷contentView是否為null

2:使用viewHolder緩存數據,實現一步加載

3:分頁加載:

1)如果自定義適配器,那麼在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView並返回,如果不為null則直接使用。在這個方法中盡可能少創建view。

2)給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,可以達到數據異步加載的效果。

3)如果listview需要顯示的item很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。分頁加載還沒學習。

34、 MVC設計模式在Android中的應用?

1.模型層(model):對數據庫操作,對網絡等操作都應在model中處理,對業務的計算等操作都應在該層。可以簡單的理解為Android中的Java源文件

2.視圖層(view):一般采用XML進行描述,使用的時候可以方便的引入,可以簡單的理解為Android中Layout文件。 Android中也可以用JavaScript+HTML 等方式作為view 層。

3.控制層(controller):控制model和view的協調工作。簡單的理解為Android中manifest文件。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved