Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android面試題目整理與講解(二)

Android面試題目整理與講解(二)

編輯:關於Android編程

1.Dalvik和標准Java虛擬機之間的主要差別?

Dalvik和標准Java虛擬機(JVM)之間的首要差別之一,就是Dalvik基於寄存器,而JVM基於棧。
Dalvik和Java之間的另外一大區別就是運行環境——Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機的實例,並且每一個 Dalvik應用作為一個獨立的Linux進程執行。
(1)虛擬機很小,使用的空間也小;
(2)Dalvik沒有JIT編譯器;
(3)常量池已被修改為只使用32位的索引,以簡化解釋器;
(4)它使用自己的字節碼,而非Java字節碼。
也就是說,每一個應用程序在Android平台下,都是運行在一個獨立的dalvik虛擬機上,而每一個dalvik虛擬機都是LINUX下一個進程,所以,應用程序的進程,dalvik虛擬機的進程和LINUX的進程,這三個概念都是一個意思。

2.onSaveInstanceState,有什麼作用?為了保證程序的正確性,一般在哪裡寫上持久層操作的代碼?

onSaveInstanceState這個方法是在Activity被意外遮擋的時候調用(區別與用戶手動的退出),比如說是突然來電話,或者是用戶點擊Home鍵的時候才會調用,應用程序界面在後台可能被殺死,也可能不被殺死,所以我們在這個方法裡面可以保存一些界面的數值,若Activity被殺死,這些數值會被持久化到手機的硬盤。當我們再次進入的時候,我們可以調用onRestoreInstanceState,進行界面恢復。 由於onSaveInstanceState和onRestoreInstanceState這兩個方法都不一定被系統調用,所以我們一般在onPause()方法裡面,對數據進行持久化操作。

3.view如何刷新?簡述什麼是雙緩沖?

android中實現view的更新有兩個方法,一個是invalidate,另一個是postInvalidate,其中前者是在UI線程自身中使用,而後者在非UI線程中使用。

閃爍是圖形編程的一個常見問題。當進行復雜的繪制操作時會導致呈現的圖像閃爍或具有其他不可接受的外觀。雙緩沖的使用解決這些問題。雙緩沖使用內存緩沖區來解決由多重繪制操作造成的閃爍問題。當使用雙緩沖時,首先在內存緩沖區裡完成所有繪制操作,而不是在屏幕上直接進行繪圖。當所有繪制操作完成後,把內存緩沖區完成的圖像直接復制到屏幕。因為在屏幕上只執行一個圖形操作,所以消除了由復雜繪制操作造成的圖像閃爍問題。
在android中實現雙緩沖,可以使用一個後台畫布backcanvas,先把所有繪制操作都在這上面進行。等圖畫好了,然後在把backcanvas拷貝到
與屏幕關聯的canvas上去,如下:
Bitmap bitmapBase = new Bitmap()
Canvas backcanvas = new Canvas(bitmapBase)
backcanvas.draw()...//畫圖
Canvas c = lockCanvas(null);
c.drawbitmap(bitmapBase);//把已經畫好的圖像輸出到屏幕上
unlock(c)....

4.說一下對廣播接收者有哪些了解

廣播接收者(BroadcastReceiver)用於接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,這個特性跟JMS中的Topic消息接收者類似。要實現一個廣播接收者方法如下:
第一步:繼承BroadcastReceiver,並重寫onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
}
}
第二步:訂閱感興趣的廣播Intent,訂閱方法有兩種:
第一種:使用代碼進行訂閱
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二種:在AndroidManifest.xml文件中的節點裡進行訂閱:







廣播類型:

廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優先級別,被接收者依次接收廣播。如:A的級別高於B,B的級別高於C,那麼,廣播先傳給A,再傳給B,最後傳給C 。優先級別聲明在intent-filter元素的android:priority屬性中,數越大優先級別越高,取值范圍:-1000到1000,優先級別也可以調用IntentFilter對象的setPriority()進行設置 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,後面的接收者就無法接收到廣播。另外,有序廣播的接收者可以將數據傳遞給下一個接收者,如:A得到廣播後,可以往它的結果對象中存入數據,當廣播傳給B時,B可以從A的結果對象中得到A存入的數據。

Context.sendBroadcast()
發送的是普通廣播,所有訂閱者都有機會獲得並進行處理。
Context.sendOrderedBroadcast()
發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者,前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,後面的接收者就再也無法獲取到廣播。對於有序廣播,前面的接收者可以將數據通過setResultExtras(Bundle)方法存放進結果對象,然後傳給下一個接收者,下一個接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲取上一個接收者存入在結果對象中的數據。


系統收到短信,發出的廣播屬於有序廣播。如果想阻止用戶收到短信,可以通過設置優先級,讓你們自定義的接收者先獲取到廣播,然後終止廣播,這樣用戶就接收不到短信了。

廣播接收者的響應:
在Android中,每次廣播消息到來時都會創建BroadcastReceiver實例並執行onReceive() 方法, onReceive() 方法執行完後,BroadcastReceiver 的實例就會被銷毀。當onReceive() 方法在10秒內沒有執行完畢,Android會認為該程序無響應。所以在BroadcastReceiver裡不能做一些比較耗時的操作,否側會彈出ANR(Application No Response)的對話框。如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成。這裡不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束BroadcastReceiver就先結束了。BroadcastReceiver一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存時被優先殺死,因為它屬於空進程(沒有任何活動組件的進程)。如果它的宿主進程被殺死,那麼正在工作的子線程也會被殺死。所以采用子線程來解決是不可靠的。

public class IncomingSMSReceiver extends BroadcastReceiver {
@Override

public void onReceive(Context context, Intent intent) {
//發送Intent啟動服務,由服務來完成比較耗時的操作
Intent service = new Intent(context, XxxService.class);
context.startService(service);
}
}

常用廣播Intent:

除了短信到來廣播Intent,Android還有很多廣播Intent,如:開機啟動、電池電量變化、時間已經改變等廣播Intent。
接收電池電量變化廣播Intent ,在AndroidManifest.xml文件中的節點裡訂閱此Intent:






接收開機啟動廣播Intent,在AndroidManifest.xml文件中的節點裡訂閱此Intent:





並且要進行權限聲明:


廣播接收者生命周期

廣播接收者的生命周期是非常短暫的,在接收到廣播的時候創建,onReceive()方法結束之後銷毀
廣播接收者中不要做一些耗時的工作,否則會彈出Application No Response錯誤對話框
最好也不要在廣播接收者中創建子線程做耗時的工作,因為廣播接收者被銷毀後進程就成為了空進程,很容易被系統殺掉
耗時的較長的工作最好放在服務中完成
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved