Android常見面試題(一)

總結了一些常見的Android面試題,內容會隨着不斷學習陸續添加。答案有誤地方但願你們可以指正 ,同一時候但願你們一塊兒補充總結不少其它常見問題。謝謝^_^java

1. 簡述Activity的生命週期
2. 請簡單說下對廣播接收者有哪些瞭解
3. view怎樣刷新?簡述什麼是雙緩衝?
四、AIDL的全稱是什麼?怎樣工做?能處理哪些類型的數據?
五、java中怎樣引用本地語言
六、談談Android的IPC(進程間通訊)機制
七、NDK 是什麼
八、怎樣將SQLite數據庫(xxx.db文件)與apk文件一塊兒公佈android

1.簡述Activity的生命週期面試

一、Activity可見並得到焦點
當Activity啓動的時候。首先調用onCreate()、onStart(),onResume()方法,此時Activity對用戶來講。是可見的狀態數據庫

二、Activity可見但沒得到焦點
當Activity從可見狀態變爲被Dialog遮擋的狀態的時候,會調用onPause()方法,此時的Activity對用戶可見,但是不能得到焦點編程

三、Activity不可見
當Activity從可見狀態變爲被其它的Activity全然覆蓋或者是點擊Home進入後臺的時候,會依次調用onPause()//onStop()方法。假設在這個期間。系統內存不足,致使Activity被回收的話。還會調用onDestory()方法canvas

四、Activity可見、沒得到焦點狀態 –> Activity可見、得到焦點狀態
當Activity從被Dialog遮擋的狀態恢復的時候。會調用onResume()方法,從而恢復可以點擊的狀態數組

五、Activity不可見、沒得到焦點狀態 –> Activity可見、得到焦點狀態
當Activity從被其它Activity遮擋或者是進入後臺狀態後恢復,若沒有被系統回收。會依次調用onRestart()、onStart()、onResume()方法。恢復到可以與用戶進行交互的狀態markdown

六、Activity不可見狀態–> Activity被回收 –> Activity可見、得到焦點狀態
當Activity從被其它Activity遮擋或者進入後臺,並且被系統回收的時候,此時恢復Activity,至關於又一次打開一個Activity。既調用onCreate()、onStart()//onResume()方法,從而恢復到可與用戶進行交互的狀態(期間可調用onRestoreInstanceState()。進行界面恢復)。異步

七、Activity可見、得到焦點狀態 –> Activity可見、沒得到焦點狀態 或 不可見狀態
在onPause()方法運行後,系統會中止一些消耗 CPU 的操做,因爲這個時候程序的優先級減小。很是有可能被系統收回,因此咱們應該在這種方法裏作數據持久化處理。保存的數據可在 onResume() 裏讀出來,幫用戶恢復到以前的狀態。編程語言

八、Activity結束
在onDestroy()運行後,activity生命週期就結束了,可用 isFinishing()方法來推斷。

假設此時有 Progress Dialog顯示。咱們應該在onDestroy()裏 cancel 掉。不然線程結束的時候,調用Dialog 的 cancel 方法會拋異常。

2.請簡單說下對廣播接收者有哪些瞭解

廣播接收者(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文件裏的節點裏進行訂閱:

<receiver android:name=".IncomingSMSReceiver">
      <intent-filter>
          <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
     </intent-filter>
 </receiver>

廣播類型:

廣播分爲兩種不一樣的類型:「普通廣播(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的所在進程很是easy在系統需要內存時被優先殺死,因爲它屬於空進程(沒有不論什麼活動組件的進程)。假設它的宿主進程被殺死。那麼正在工做的子線程也會被殺死。

因此採用子線程來解決是不可靠的。

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:

<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"/>

接收電池電量變化廣播Intent ,在AndroidManifest.xml文件裏的節點裏訂閱此Intent:

<receiver android:name=".IncomingSMSReceiver">
     <intent-filter>
          <action android:name="android.intent.action.BATTERY_CHANGED"/>
     </intent-filter>
 </receiver>

廣播接收者的生命週期及使用注意事項

一、廣播接收者的生命週期是很是短暫的。在接收到廣播的時候建立,onReceive()方法結束以後銷燬

二、廣播接收者中不要作一些耗時的工做,不然會彈出Application No Response錯誤對話框,耗時的較長的工做最好放在服務中完畢

三、最好也不要在廣播接收者中建立子線程作耗時的工做,因爲廣播接收者被銷燬後進程就成爲了空進程,很是easy被系統殺掉

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)....

四、AIDL的全稱是什麼?怎樣工做?能處理哪些類型的數據?

全稱是:Android Interface Define Language

在 Android 中, 每個應用程序都可以有本身的進程。

在寫 UI 應用的時候, 常常要用到
Service。

在不一樣的進程中, 怎樣傳遞對象呢?

顯然, Java 中不一樣意跨進程內存共享。

所以傳遞對象, 僅僅能把對象拆分紅操做系統能理解的簡單形式, 以達到跨界對象訪問的目的。

在J2EE 中,採用 RMI 的方式, 可以經過序列化傳遞對象。在 Android 中, 則採用 AIDL 的方式。

理論上 AIDL 可以傳遞 Bundle,實際上作起來卻比較麻煩。

AIDL(AndRoid 接口描寫敘述語言)是一種藉口描寫敘述語言; 編譯器可以經過 aidl 文件生成一段代碼。經過預先定義的接口達到兩個進程內部通訊進程的目的。 假設需要在一個 Activity 中, 訪問還有一個 Service 中的某個對象, 需要先將對象轉化成 AIDL 可識別的參數(多是多個參數),而後使用 AIDL 來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成本身需要的對象。

AIDL 的 IPC 的機制和 COM 或 CORBA 類似, 是基於接口的,但它是輕量級的。它使用代理類在client和實現層間傳遞值。假設要使用 AIDL, 需要完畢 2 件事情: 1. 引入 AIDL 的相關類; 2.調用 aidl 產生的 class。

AIDL 的建立方法:

AIDL 語法很是簡單,可以用來聲明一個帶一個或多個方法的接口。也可以傳遞參數和返回值。
因爲遠程調用的需要, 這些參數和返回值並不是不論什麼類型。如下是些 AIDL 支持的數據類型:
一、 不需要 import 聲明的簡單 Java 編程語言類型(int,boolean 等);
二、String, CharSequence 不需要特殊聲明。
三、 List, Map 和 Parcelables 類型, 這些類型內所包括的數據成員也僅僅能是簡單數據類型, String 等其它支持的類型。

五、java中怎樣引用本地語言

可以用JNI(java native interface java 本地接口)接口

六、談談Android的IPC(進程間通訊)機制

IPC 是內部進程通訊的簡稱。是共享」命名管道」的資源。Android 中的 IPC 機制是爲了
讓 Activity 和 Service 之間可以隨時的進行交互,故在 Android 中該機制。僅僅適用於 Activity和 Service 之間的通訊。類似於遠程方法調用,類似於 C/S 模式的訪問。經過定義 AIDL 接口文件來定義 IPC 接口。Servier 端實現 IPC 接口,Client 端調用 IPC 接口本地代理。

七、NDK 是什麼

NDK 是一些列工具的集合。 NDK 提供了一系列的工具,幫助開發人員迅速的開發 C/C++的動態庫,並能本身主動將 so 和 java 應用打成 apk 包。

NDK 集成了交叉編譯器,並提供了對應的 mk 文件和隔離 cpu、平臺等的差別。開發人員僅僅需簡單的改動 mk 文件就可以建立出 so。

八、怎樣將SQLite數據庫(xxx.db文件)與apk文件一塊兒公佈

可以將xxx.db文件拷貝到Eclipse Androidproject中的res aw文件夾中。所有在res aw文件夾中的文件不會被壓縮。這樣可以直接提取該文件夾中的文件。可以將xxx.db文件拷貝到res aw文件夾中。

相關文章
相關標籤/搜索