1. 程式人生 > >Android 常見面試題

Android 常見面試題

actor iap timer key 簡單 mar star ray 緩存

這些面試是我之前總結的 。覺得還不錯,就貼出來與大家分享一下。當中有不少問題。也是我以前被面試官問過的問題,另一些基礎問題總結(既然是基礎知識 ,必定是成為一名的 Android 開發者 所必須掌握的 )。

有多個問題,我都替你試過了,這樣回答面試官。還能夠啊,嘿嘿

1、 Android中四大組件及其作用?
1、Activity:activity是用戶和應用程序交互的窗體,一個activity相當於我們實際中的一個網頁。當打開一個屏幕時,之前的那一個屏幕會被置為暫停狀態。而且壓入歷史堆棧中,用戶能夠通過回退操作返回到以前打開過的屏幕。activity的生命周期:即“產生、運行、銷毀”。可是這當中會調用很多方法onCreate(創建) 、onStart(激活)、onResume(恢復)、onPause(暫停)、onStop(停止)、onDestroy(銷毀)、onRestart(重新啟動)。
2、Service:Service是一種程序,它能夠運行非常長的時間,相當於後臺的一個服務。通過startService(Intent service)能夠啟動一個Service,通過Context.bindService()能夠綁定一個Service。


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

用戶還能夠通過Context.sendBroadcast()將他們自己的intent broadcasts廣播給其它的應用程序。


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

2、ListView的優化方案?

1、假設自己定義適配器,那麽在getView方法中要考慮方法傳進來的參數contentView是否為null。假設為null就創建contentView並返回。假設不為null則直接使用。

在這種方法中盡可能少創建view。
2、給contentView設置tag(setTag()),傳入一個viewHolder對象, 用於緩存要顯示的數據,能夠達到圖像數據異步載入的效果。
3、假設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這些系統自帶的適配器,對於事件的響應僅僅能局限在一個行單位。

假設一行裏面有一個button控件,它們之間的響應操作是不一樣的。若採用系統自帶的適配器。就不能精確到每一個控件的響應事件。這時,我們一般採取自己定義適配器來實現這個比較精確地請求。

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的實現步驟?

server端:
1:server端寫AIDL
2:server端繼承Service。重寫3個方法
3:server端實例化一個AIDL定義接口的Stub對象,並實現接口的抽象方法;
4:配置文件
client:
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這些系統自帶的適配器,對於事件的響應僅僅能局限在一個行單位。假設一行裏面有一個button控件,它們之間的響應操作是不一樣的。若採用系統自帶的適配器,就不能精確到每一個控件的響應事件。

這時。我們一般採取自己定義適配器來實現這個比較精確地請求。

11、寫出ListView優化的代碼。已知自己定義ListView中自己定義布局文件為list_item.xml裏面有ImageView和TextView兩個組件,其id為item_image、item_text。

public View getView(int position, View convertView, ViewGroup parent) {  
// TODO Auto-generated method stub  
    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僅僅能在該project的內部共享數據,ContentProvider能在project之間實現數據共享。

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()方法前腰先進行一些推斷,不然一次性調用
多次同樣的方法easy出錯。調用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) 對button加入點擊事件

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

Android 常見面試題