android的面試題(二)
來源:程序員人生 發布時間:2015-03-09 08:47:19 閱讀次數:3576次
1.Dalvik和標準Java虛擬機之間的主要差別?
Dalvik和標準Java虛擬機(JVM)之間的重要差別之1,就是Dalvik基于寄存器,而JVM基于棧。
Dalvik和Java之間的另外1大區分就是運行環境――Dalvik經過優化,允許在有限的內存中同時運行多個虛擬機的實例,并且每個 Dalvik利用作為1個獨立的Linux進程履行。
(1)虛擬機很小,使用的空間也小;
(2)Dalvik沒有JIT編譯器;
(3)常量池已被修改成只使用32位的索引,以簡化解釋器;
(4)它使用自己的字節碼,而非Java字節碼。
也就是說,每個利用程序在Android平臺下,都是運行在1個獨立的dalvik虛擬機上,而每個dalvik虛擬機都是LINUX下1個進程,所以,利用程序的進程,dalvik虛擬機的進程和LINUX的進程,這3個概念都是1個意思。
2.onSaveInstanceState,有甚么作用?為了保證程序的正確性,1般在哪里寫上持久層操作的代碼?
onSaveInstanceState這個方法是在Activity被意外遮擋的時候調用(區分與用戶手動的退出),比如說是突然來電話,或是用戶點擊Home鍵的時候才會調用,利用程序界面在后臺可能被殺死,也可能不被殺死,所以我們在這個方法里面可以保存1些界面的數值,若Activity被殺死,這些數值會被持久化得手機的硬盤。當我們再次進入的時候,我們可以調用onRestoreInstanceState,進行界面恢復。
由于onSaveInstanceState和onRestoreInstanceState這兩個方法都不1定被系統調用,所以我們1般在onPause()方法里面,對數據進行持久化操作。
3.view如何刷新?簡述甚么是雙緩沖?
android中實現view的更新有兩個方法,1個是invalidate,另外一個是postInvalidate,其中前者是在UI線程本身中使用,而后者在非UI線程中使用。
閃爍是圖形編程的1個常見問題。當進行復雜的繪制操作時會致使顯現的圖象閃爍或具有其他不可接受的外觀。雙緩沖的使用解決這些問題。雙緩沖使用內存緩沖區來解決由多重繪制操作釀成的閃爍問題。當使用雙緩沖時,首先在內存緩沖區里完成所有繪制操作,而不是在屏幕上直接進行繪圖。當所有繪制操作完成后,把內存緩沖區完成的圖象直接復制到屏幕。由于在屏幕上只履行1個圖形操作,所以消除由復雜繪制操作釀成的圖象閃爍問題。
在android中實現雙緩沖,可使用1個后臺畫布backcanvas,先把所有繪制操作都在這上面進行。等圖畫好了,然后在把backcanvas拷貝到
與屏幕關聯的canvas上去,以下:
Bitmap bitmapBase = new Bitmap()
Canvas backcanvas = new Canvas(bitmapBase)
backcanvas.draw()...//畫圖
Canvas c = lockCanvas(null);
c.drawbitmap(bitmapBase);//把已畫好的圖象輸出到屏幕上
unlock(c)....
4.說1下對廣播接收者有哪些了解
廣播接收者(BroadcastReceiver)用于接收廣播Intent,廣播Intent的發送是通過調用Context.sendBroadcast()、Context.sendOrderedBroadcast()來實現的。通常1個廣播Intent可以被定閱了此Intent的多個廣播接收者所接收,這個特性跟JMS中的Topic消息接收者類似。要實現1個廣播接收者方法以下:
第1步:繼承BroadcastReceiver,并重寫onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
}
}
第2步:定閱感興趣的廣播Intent,定閱方法有兩種:
第1種:使用代碼進行定閱
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第2種:在AndroidManifest.xml文件中的<application>節點里進行定閱:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
廣播類型:
廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同1時刻(邏輯上)被所有接收者接收到,消息傳遞的效力比較高,但缺點是:接收者不能將處理結果傳遞給下1個接收者,并且沒法終止廣播Intent的傳播;但是有序廣播是依照接收者聲明的優先級別,被接收者順次接收廣播。如:A的級別高于B,B的級別高于C,那末,廣播先傳給A,再傳給B,最后傳給C 。優先級別聲明在intent-filter元素的android:priority屬性中,數越大優先級別越高,取值范圍:⑴000到1000,優先級別也能夠調用IntentFilter對象的setPriority()進行設置
。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播1旦終止,后面的接收者就沒法接收到廣播。另外,有序廣播的接收者可以將數據傳遞給下1個接收者,如:A得到廣播后,可以往它的結果對象中存入數據,當廣播傳給B時,B可以從A的結果對象中得到A存入的數據。
Context.sendBroadcast()
發送的是普通廣播,所有定閱者都有機會取得并進行處理。
Context.sendOrderedBroadcast()
發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐一履行接收者,前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也沒法獲得到廣播。對有序廣播,前面的接收者可以將數據通過setResultExtras(Bundle)方法寄存進結果對象,然后傳給下1個接收者,下1個接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲得上1個接收者存入在結果對象中的數據。
系統收到短信,發出的廣播屬于有序廣播。如果想禁止用戶收到短信,可以通過設置優先級,讓你們自定義的接收者先獲得到廣播,然后終止廣播,這樣用戶就接收不到短信了。
廣播接收者的響應:
在Android中,每次廣播消息到來時都會創建BroadcastReceiver實例并履行onReceive() 方法, onReceive() 方法履行完后,BroadcastReceiver 的實例就會被燒毀。當onReceive() 方法在10秒內沒有履行終了,Android會認為該程序無響應。所以在BroadcastReceiver里不能做1些比較耗時的操作,否側會彈出ANR(Application No Response)的對話框。如果需要完成1項比較耗時的工作,應當通過發送Intent給Service,由Service來完成。這里不能使用子線程來解決,由于BroadcastReceiver的生命周期很短,子線程可能還沒有結束BroadcastReceiver就先結束了。BroadcastReceiver1旦結束,此時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文件中的<application>節點里定閱此Intent:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BATTERY_CHANGED"/>
</intent-filter>
</receiver>
接收開機啟動廣播Intent,在AndroidManifest.xml文件中的<application>節點里定閱此Intent:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
并且要進行權限聲明:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
廣播接收者生命周期
廣播接收者的生命周期是非常短暫的,在接收到廣播的時候創建,onReceive()方法結束以后燒毀
廣播接收者中不要做1些耗時的工作,否則會彈出Application No Response毛病對話框
最好也不要在廣播接收者中創建子線程做耗時的工作,由于廣播接收者被燒毀落后程就成了空進程,很容易被系統殺掉
耗時的較長的工作最好放在服務中完成
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈