android面試題及答案

怎樣修改檔案,下面就由本站小編為大家介紹一下的android面試題-簡答題文章,歡迎閱讀。

android面試題及答案

android面試題-簡答題篇1

1、在多執行緒程式設計這塊,我們經常要使用Handler,Thread和Runnable這三個類,那麼他們之間的關係你是否弄清楚了呢?

答:Android的CPU分配的最小單元是執行緒,Handler一般是在某個執行緒裡建立的,因而Handler和Thread就是相互繫結的,一一對應。而Runnable是一個介面,Thread是Runnable的子類。所以說,他倆都算一個程序。HandlerThread顧名思義就是可以處理訊息迴圈的執行緒,他是一個擁有Looper的執行緒,可以處理訊息迴圈。與其說Handler和一個執行緒繫結,不如說Handler是和Looper一一對應的。最後需要說明的是,在UI執行緒(主執行緒)中: mHandler=new Handler;

(new Runnable{

void run{

//執行程式碼...}

});

這個執行緒其實是在UI執行緒之內執行的,並沒有新建執行緒。

常見的新建執行緒的方法是:

Thread thread = new Thread;

t;

HandlerThread thread = newHandlerThread("string");

t;

2、如何設定應用程式為系統級別的應用?

答:apk 獲取system許可權;如何獲取如下:

第一個方法簡單點,不過需要在Android系統原始碼的環境下用make來編譯:

1. 在應用程式的中的manifest節點中加入android:sharedUserId="em"這個屬性。

2. 修改檔案,加入LOCAL_CERTIFICATE := platform這一行

3. 使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。

第二個方法是直接把eclipse編出來的apk用系統的簽名檔案簽名

1. 加入android:sharedUserId="em"這個屬性。

2. 使用eclipse編譯出apk檔案。

3. 使用目標系統的platform金鑰來重新給apk檔案簽名。首先找到金鑰檔案,在我ndroid原始碼目錄中的位置是"build/target/product/security",下面的8和兩個檔案。然後用Android提供的Signapk工具來簽名,signapk的原始碼是在"build/tools/signapk"下,編譯後在out/host/Linux-x86/framework下,用法為Java 8 "。

加入android:sharedUserId="em"這個屬性。通過Shared User id,擁有同一個User id的多個APK可以配置成執行在同一個程序中。那麼把程式的UID配成em,也就是要讓程式執行在系統程序中,這樣就有許可權來修改系統時間了。

只是加入UID還不夠,如果這時候安裝APK的話發現無法安裝,提示簽名不符,原因是程式想要執行在系統程序中還要有目標系統的platform key,就是上面第二個方法提到的8和兩個檔案。用這兩個key簽名後apk才真正可以放入系統程序中。第一個方法中加入LOCAL_CERTIFICATE :=platform其實就是用這兩個key來簽名。

這也有一個問題,就是這樣生成的程式只有在原始的Android系統或者是自己編譯的系統中才可以用,因為這樣的系統才可以拿到8和兩個檔案。要是別家公司做的Android上連安裝都安裝不了。試試原始的Android中的key來簽名,程式在模擬器上執行OK,不過放到G3上安裝直接提示"Package... has no signatures that match those in shared user em",這樣也是保護了系統的安全。

3、談談Android的IPC(程序間通訊)機制

答:Android系統中,每一個應用程式都是由一些Activity和Service組成的,這些Activity和Service有可能執行在同一個程序中,也有可能執行在不同的程序中,android的IPC機制也就是Binder機制,Android系統是基於Linux核心的,而Linux核心繼承和相容了豐富的Unix系統程序間通訊(IPC)機制, 但是,Android系統沒有采用上述提到的各種程序間通訊機制,而是採用Binder機制,Binder是一種程序間通訊機制,它是一種類似於COM和CORBA分散式元件架構,通俗一點,其實是提供遠端過程呼叫(RPC)功能。從英文字面上意思看,Binder具有粘結劑的意思,那麼它把什麼東西粘結在一起呢?在Android系統的Binder機制中,由一系統元件組成,分別是Client、Server、Service Manager和Binder驅動程式,其中Client、Server和Service Manager執行在使用者空間,Binder驅動程式執行核心空間。Binder就是一種把這四個元件粘合在一起的粘結劑了,其中,核心元件便是Binder驅動程式了,Service Manager提供了輔助管理的功能,Client和Server正是在Binder驅動和ServiceManager提供的基礎設施上,進行Client-Server之間的通訊;

1. Client、Server和Service Manager實現在使用者空間中,Binder驅動程式實現在核心空間中

2. Binder驅動程式和Service Manager在Android平臺中已經實現,開發者只需要在使用者空間實現自己的Client和Server

er驅動程式提供裝置檔案/dev/binder與使用者空間互動,Client、Server和Service Manager通過open和ioctl檔案操作函式與Binder驅動程式進行通訊

4. Client和Server之間的程序間通訊通過Binder驅動程式間接實現

5. Service Manager是一個守護程序,用來管理Server,並向Client提供查詢Server介面的能力

4、apk安裝解除安裝的原理

答:APK安裝可以通過以下四種方式:

1. 系統應用安裝,開機時完成系統應用的檢查,沒安裝就安裝,安裝就跳過,無安裝介面。

2. 網路下載應用安裝,通過market應用完成,無安裝介面。

3. ADB工具安裝,無安裝介面

4. 通過SD卡來安裝apk,有安裝介面,由應用處理安裝及解除安裝過程的介面。

應用安裝涉及到如下幾個目錄:

system/app 系統自帶的應用程式,無法刪除

data/app 使用者程式安裝的目錄,有刪除許可權

data/data 存放應用程式的資料

Data/dalvik-cache 將apk中的dex檔案安裝到dalvik-cache目錄下

(dex檔案是dalvik虛擬機器的可執行檔案,其大小約為原始apk檔案大小的四分之一)

安裝過程:複製APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex檔案(Dalvik位元組碼)儲存到dalvik-cache目錄,並data/data目錄下建立對應的應用資料目錄。

解除安裝過程:刪除安裝過程中在上述三個目錄下建立的檔案及目錄。

5、如何做適配

1)android有H、L、M、X、XX四個不同的資料夾存放不同解析度的圖片,系統會自動載入

2) 偏移量d的設定可以在values-hpdi,values-mdpi,values-ldpi三種資料夾中的檔案進行設定

值得一提的是:

40dp

-14dp

這裡的負數是完全起作用的,系統會認為它是一個負值

3)各大手機廠商對於Android作業系統都有或多或少的改動,當然這些改動會對我們應用程式產生某些影響

比如:

(1)系統原始碼中連線music服務的aidl檔案所在包名:c

(2)LG則可能將該aidl檔案修改所在的包(例如修改為 er),並且修改其中的檔案內容(增加一個方法,或者減少幾個方法,或者修改方法名稱)那麼我們的應用要想在LG的手機上釋出,那麼我們就必須改變所要連線的aidl檔案,必須跟LG廠商修改的完全一致。

android面試題-簡答題篇2

1、是否進行過apk反編譯,如何防止反編譯

反編譯:

Android反編譯工具

· dex2jar + jdgui

· apktool

防止反編譯:

· 程式碼加密

這方式,也只能想想,一旦你自己加密了,Android系統都不認識你了,還怎麼執行?(如果有那估計就是eoe現在推的愛加密吧).

· 程式碼混淆

這種方式,其實我不大願意將他歸類於防止反編譯,從Android、Java編譯原理上來說,針對自身程式碼做混淆等操作,必然防止不了反編譯這個事實。他能做到的就是將字元,函式等混淆成各種a,b,c,d,1,2,3等。

這種方式一般稱為,

妨礙對反編譯程式碼的閱讀、觀看和理解

Android中主要是針對 的配置來實現。

具體的實現網上針對這部分的解釋已經太多,所以這裡不詳細介紹了。

· 動態載入類

這種方式的啟發是根據web端來的。Web端你要防止,那就不釋出唄。

所以我們可以將我們重要的原始碼,丟在伺服器上,必要的時候通過DexClassLoader類去載入重要類。來防止核心程式碼被反編譯。

具體可看DexClassLoader示例

· 用NDK開發核心程式碼

從上面已經能知道,C/C++等編譯型語言的反彙編難度。所以我們可以放心的使用NDK去開發,生成SO庫檔案再來呼叫。

PS:部分資原始檔若十分珍貴,可以通過 #include直接編譯到庫裡(當然記憶體可能就大了),這種方式可以自己考慮。

2、Android的動畫分類以及兩種動畫的闡述

Tween動畫

又稱“補間動畫”、“中間動畫”,最早接觸Tween類是在學習Flash時候,使用ActionScript做動畫的時候,使用過類Tween。

Tween動畫主要的功能是在繪製動畫前設定動畫繪製的軌跡,包括時間, 位置 ,等等。但是Tween動畫的缺點是它只能設定起始點與結束點的兩幀,中間過程全部由系統幫我們完成。所以在幀數比較多的遊戲開發中是不太會用到它的。

Tween一共提供了4中動畫的效果

Scale:縮放動畫

Rotate:旋轉動畫

Translate:移動動畫

Alpha::透明漸變動畫

Frame動畫

又稱幀動畫,主要顯示方式是為動畫的總標籤,這裡面放著幀動畫標籤,也就是說若干標籤的幀 組合在一起就是幀動畫了。 標籤中android:oneshot="false"這是一個非常重要的屬性,預設為false 表示 動畫迴圈播放, 如果這裡寫true 則表示動畫只播發一次。 標籤中記錄著每一幀的資訊android:drawable="@drawable/a"表示這一幀用的圖片為"a",下面以此類推。 android:duration="100" 表示這一幀持續100毫秒,可以根據這個值來調節動畫播放的速度。

3、AIDL全稱,如何工作,可處理那些資料

答:AIDL的英文全稱是Android Interface Define Language

當A程序要去呼叫B程序中的service時,並實現通訊,我們通常都是通過AIDL來操作的

A工程:

首先我們在service包中建立一個檔案,在裡面我們自定義一個介面,含有方法get。ADT外掛會在gen目錄下自動生成一個檔案,該類中含有一個名為的內部類,該內部類中含有aidl檔案介面的get方法。

說明一:aidl檔案的位置不固定,可以任意

然後定義自己的MyService類,在MyService類中自定義一個內部類去繼承這個內部類,實現get方法。在onBind方法中返回這個內部類的物件,系統會自動將這個物件封裝成IBinder物件,傳遞給他的呼叫者。

其次需要在檔案中配置MyService類,程式碼如下:

為什麼要指定呼叫AIDL服務的ID,就是要告訴外界MyService這個類能夠被別的程序訪問,只要別的程序知道這個ID,正是有了這個ID,B工程才能找到A工程實現通訊。

說明:AIDL並不需要許可權

B工程:

首先我們要將A工程中生成的檔案拷貝到B工程中,在bindService方法中繫結aidl服務

繫結AIDL服務就是將RemoteService的ID作為intent的action引數。

說明:如果我們單獨將檔案放在一個包裡,那個在我們將gen目錄下的該包拷貝到B工程中。如果我們將檔案和我們的其他類存放在一起,那麼我們在B工程中就要建立相應的包,以保證檔案的報名正確,我們不能修改檔案

bindService(newInten("teService"),serviceConnection,_AUTO_CREATE);

ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service引數就是A工程中MyService類中繼承了類的內部類的物件。

4、Android系統中GC什麼情況下不會出現記憶體洩露

1. 資料庫的cursor沒有關閉

2.構造adapter時,沒有使用快取contentview

衍生listview的優化問題-----減少建立view的物件,充分使用contentview,可以使用一靜態類來優化處理getview的過程/

ap物件不使用時採用recycle釋放記憶體

vity中的物件的生命週期大於activity

除錯方法: DDMS==> HEAPSZIE==>dataobject==>[TotalSize]

5、什麼情況會導致Force Close ?如何避免?能否捕獲導致其的異常?

答:一般像空指標啊,可以看起logcat,然後對應到程式中 來解決錯誤

android面試題-簡答題篇3

1、activity的4種模式,以及不同模式的作用。activity有四種啟動模式,分別為standard,singleTop,singleTask,singleInstance。如果要使用這四種啟動模式,必須在manifest檔案中標籤中的launchMode屬性中配置,如:

android:label="@string/interstitial_label"

android:theme="@style/og"

android:launchMode="singleTask"

standard

標準啟動模式,也是activity的預設啟動模式。在這種模式下啟動的activity可以被多次例項化,即在同一個任務中可以存在多個activity的例項,每個例項都會處理一個Intent物件。如果Activity A的啟動模式為standard,並且A已經啟動,在A中再次啟動Activity A,即呼叫startActivity(new Intent(this,s)),會在A的上面再次啟動一個A的例項,即當前的桟中的狀態為A-->A。

singleTop

如果一個以singleTop模式啟動的activity的例項已經存在於任務桟的桟頂,那麼再啟動這個Activity時,不會建立新的例項,而是重用位於棧頂的那個例項,並且會呼叫該例項的onNewIntent方法將Intent物件傳遞到這個例項中。舉例來說,如果A的啟動模式為singleTop,並且A的一個例項已經存在於棧頂中,那麼再呼叫startActivity(new Intent(this,s))啟動A時,不會再次建立A的例項,而是重用原來的例項,並且呼叫原來例項的onNewIntent方法。這是任務桟中還是這有一個A的例項。

如果以singleTop模式啟動的activity的一個例項已經存在與任務桟中,但是不在桟頂,那麼它的行為和standard模式相同,也會建立多個例項。

singleTask

谷歌的官方文件上稱,如果一個activity的啟動模式為singleTask,那麼系統總會在一個新任務的最底部(root)啟動這個activity,並且被這個activity啟動的其他activity會和該activity同時存在於這個新任務中。如果系統中已經存在這樣的一個activity則會重用這個例項,並且呼叫他的onNewIntent方法。即,這樣的一個activity在系統中只會存在一個例項。

其實官方文件中的這種說法並不準確,啟動模式為singleTask的activity並不會總是開啟一個新的任務。詳情請參考 解開Android應用程式元件Activity的"singleTask"之謎,在本文後面也會通過示例來進行驗證。

singleInstance

總是在新的任務中開啟,並且這個新的任務中有且只有這一個例項,也就是說被該例項啟動的其他activity會自動運行於另一個任務中。當再次啟動該activity的例項時,會重用已存在的任務和例項。並且會呼叫這個例項的onNewIntent方法,將Intent例項傳遞到該例項中。和singleTask相同,同一時刻在系統中只會存在一個這樣的Activity例項。

2、NDK是什麼

NDK:NativeDevelopment Kit

AndroidNDK是一個讓開發人員在Android應用中嵌入使用原生代碼編寫的元件的工具集。

Android應用執行在Dalvik虛擬機器中。NDK允許開發人員使用原生代碼語言(例如C和C++)實現應用的部分功能。這樣以程式碼重用的形式能夠給某類應用提供方便,而且在某些情況下能提高執行速度(感謝老婆的幫助)。

3、請解釋下Android程式執行時許可權與檔案系統許可權的區別

答:執行時許可權Dalvik( android授權)

檔案系統 linux 核心授權

4、橫豎屏切換時候activity的生命週期?

1、不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次

3、設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法

5、如何設定Android應用為系統應用

1 將自己的應用方到android原始碼的packages/apps/目錄下,新增檔案

2 在應用程式的中的manifest節點中加入android:sharedUserId="em"這個屬性。

3 修改檔案,加入LOCAL_CERTIFICATE:= platform這一行

4 使用mm命令來編譯,生成的apk就有同system一樣的許可權了。

5 在android根目錄下用make snod重新生成

6 啟動emulator執行下應用看看是否好了。

6、如何將SQLite資料庫(檔案)與apk檔案一起釋出?

可以將檔案複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將檔案複製到res aw目錄中

7.如何將開啟res aw目錄中的資料庫檔案?

解答:在Android中不能直接開啟resaw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用RawResource方法獲得res aw目錄中資源的 InputStream物件,然後將該InputStream物件中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用OrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。

8、執行緒中wait和sleep的區別

答:wait釋放執行緒鎖,sleep不是執行緒鎖,wait不佔用系統資源sleep佔用資源

9、兩種方法註冊broadcaseReceiver,及區別。

答:動態註冊和靜態註冊一個BroadcastReceiver的區別:

動態註冊較靜態註冊靈活。實驗證明:當靜態註冊一個BroadcastReceiver時,不論應用程式是啟動與否。都可以接受對應的廣播。

動態註冊的時候,如果不執行unregisterReceiver;方法取消註冊,跟靜態是一樣的。但是如果執行該方法,當執行過以後,就不能接受廣播了。

10、在android中,請簡述jni的呼叫過程。

1)安裝和下載Cygwin,下載 Android NDK

2)在ndk專案中JNI介面的設計

3)使用C/C++實現本地方法

4)JNI生成動態連結庫檔案

5)將動態連結庫複製到java工程,在java工程中呼叫,執行java工程即可