金三銀四的跳槽季節,你準擺好了嗎?
首先我們分享一個Android知識圖譜。
下面是一些面試官基本必問的問題,請一定要去了解!
-
基礎知識 – 四大元件(生命週期,使用場景,如何啟動)
-
java基礎 – 資料結構,執行緒,mvc框架 通訊 – 網路連線(HttpClient,HttpUrlConnetion),Socket
-
資料持久化 – SQLite,SharedPreferences,ContentProvider
-
效能優化 – 佈局優化,記憶體優化,電量優化 安全 – 資料加密,程式碼混淆,WebView/Js呼叫,https
-
UI– 動畫
-
其他 – JNI,AIDL,Handler,Intent等
-
開源框架 – Volley,Gilde,RxJava等(簡歷上寫你會的,用過的) 擴充 – Android6.0/7.0/8.0特性,kotlin語言,I/O大會
整理了部分面試題,帶答案
1、Android本身的api並未宣告會丟擲異常,則其在執行時有無可能丟擲 runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決?
會,比如nullpointerException。我遇到過,比如textview.setText()時,textview沒有 初始化。會導致程式無法正常執行出現forceclose。開啟控制檯檢視logcat資訊找出最新 Android面試題異常資訊並修改程式。
2、IntentService有何優點?
Acitivity的程式,當處理Intent的時候,會產生一個對應的Service; Android的程式 處理器現在會盡可能的不kill掉你;非常容易使用
3、如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前儲存 當前狀態?
重寫onSaveInstanceState()方法,在此方法中儲存需要儲存的資料,該方法將會在 activity被回收之前呼叫。通過重寫onRestoreInstanceState()方法可以從中提取儲存好的資料
4、如何將一個Activity設定成視窗的樣式。
<activity>中配置:android :theme="@android:style/Theme.Dialog"
另外 android:theme="@android:style/Theme.Translucent" 是設定透明
複製程式碼
5、如何退出Activity?如何安全退出已呼叫多個Activity的Application?
對於單一 Activity 的應用來說,退出很簡單,直接 finish()即可。
當然, 也可以用 killProcess()和 System.exit()這樣的方法。 對於多個 activity
- 1、記錄開啟的 Activity:每開啟一個 Activity,就記錄 下來。在需要退出時,關閉每一個 Activity 即可。
- 2、傳送特定廣播:在需要結 束應用時,傳送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。
- 3、遞 歸退出:在開啟新的 Activity 時使用 startActivityForResult,然後自己加標 志,在 onActivityResult 中處理,遞迴關閉。為了程式設計方便,最好定義一個 Activity 基類,處理這些共通問題。
但是要注意的是:
- 在 2.1 之前,可以使用 ActivityManager 的 restartPackage 方法。 它可以直接結束整個應用。在使用時需要許可權 android.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。 可是,在 2.2,這個方法失效了。
- 在 2.2 新增了一個新的方法,killBackground Processes(), 需要許可權 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和 2.2 的 restartPackage 一樣,根本起不到應有的效果。
另外還有一個方法,就是系統自帶的應用程式管理裡,強制結束程式的方法,
forceStopPackage()。它需要許可權 android.permission.FORCE_STOP_PACKAGES。並且 需要新增 android:sharedUserId="android.uid.system"屬性
同樣可惜的是
該方法是非公 開的,他只能執行在系統程式,第三方程式無法呼叫。 因為需要在 Android.mk 中新增 LOCAL_CERTIFICATE := platform。 而 Android.mk 是用於在 Android 原始碼下編譯程式用的。 從以上可以看出, - 在 2.2,沒有辦法直接結束一個應用,而只能用自己的辦法間接辦到。 現提供幾個方法,供參考:
- 1、拋異常強制退出: 該方法通過拋異常,使程式 Force Close。 驗證可以,但是,需要解決的問題是,如何使程式結束掉,而不彈出 Force Close 的視窗。
- 2、記錄開啟的 Activity: 每開啟一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。 -3、傳送特定廣播: 在需要結束應用時,傳送一個特定的廣播,每個 Activity 收到廣播後,關閉即可。
- 4、遞迴退出 在開啟新的 Activity 時使用 startActivityForResult,然後自己加標誌,在 onActivityResult 中處理,遞迴關閉。
除了第一個,都是想辦法把每一個 Activity都結束掉,間接達到目的。但是這樣做同樣不完 美。你會發現,如果自己的應用程式對每一個 Activity都設定了 nosensor,在兩個 Activity 結束的間隙,sensor 可能有效了。但至少,我們的目的達到了,而且沒有影響使用者使用。 為了程式設計方便,最好定義一個 Activity基類,處理這些共通問題。
6、AIDL的全稱是什麼?如何工作?能處理哪些型別的資料?
全稱是:AndroidInterface Define Language
在 Android 中, 每個應用程式都可以有自己的程式. 在寫UI應用的時候, 經常要用到 Service.
在不同的程式中, 怎樣傳遞物件呢?顯然, Java中不允許跨程式記憶體共享.因此傳遞 物件, 只能把物件拆分成作業系統能理解的簡單形式, 以達到跨界物件訪問的目的. 在J2EE 中,採用RMI 的方式,可以通過序列化傳遞物件.在 Android 中, 則採用 AIDL 的方式. 理論上 AIDL 可以傳遞 Bundle,實際上做起來卻比較麻煩。
- AIDL(AndRoid 介面描述語言)是一種藉口描述語言;
- 編譯器可以通過aidl 檔案生成一段代 碼
- 通過預先定義的介面達到兩個程式內部通訊程式的目的.
- 如果需要在一個 Activity中, 訪 問另一個Service中的某個物件, 需要先將物件轉化成AIDL可識別的引數(可能是多個引數),
- 然後使用 AIDL 來傳遞這些引數, 在訊息的接收端, 使用這些引數組裝成自己需要的物件.
- AIDL 的 IPC 的機制和 COM 或 CORBA 類似, 是基於介面的,但它是輕量級的。
- 它使用代 理類在客戶端和實現層間傳遞值.
- 如果要使用 AIDL, 需要完成 2 件事情:
-
- 引入AIDL 的相 關類.;
- 2.呼叫aidl 產生的 class.
AIDL 的建立方法: AIDL
語法很簡單,可以用來宣告一個帶一個或多個方法的介面,也可以傳遞引數和返回值。 由於遠端呼叫的需要, 這些引數和返回值並不是任何型別. 下面是些 AIDL 支援的資料型別:
-
- 不需要 import 宣告的簡單 Java 程式語言型別(int,boolean 等)
-
- String, CharSequence 不需要特殊宣告
-
- List, Map 和 Parcelables 型別,這些型別內所包含的資料成員也只能是簡單資料型別, String 等其他比支援的型別.
7、請解釋下Android程式執行時許可權與檔案系統許可權的區別。
執行時許可權 Dalvik(android 授權)
複製程式碼
檔案系統 linux 核心授權
8、系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由。
通過直接傳送 Uri 把引數帶過去,或者通過 manifest 裡的 intentfilter 裡的 data 屬性
9、android系統的優勢和不足
Android 平臺手機 5 大優勢:
- 一、開放性 在優勢方面,Android 平臺首先就是其開發性,開發的平臺允許任何移動終端廠商加入到 Android 聯盟中來。顯著的開放性可以使其擁有更多的開發者,隨著使用者和應用的日益豐富, 一個嶄新的平臺也將很快走向成熟。開放性對於 Android 的發展而言,有利於積累人氣,這 裡的人氣包括消費者和廠商,而對於消費者來講,隨大的受益正是豐富的軟體資源。開放的平臺也會帶來更大競爭,如此一來,消費者將可以用更低的價位購得心儀的手機。
- 二、掙脫運營商的束縛 在過去很長的一段時間,特別是在歐美地區,手機應用往往受到運營商制約,使用什麼功能接入什麼網路,幾乎都受到運營商的控制。從去年 iPhone 上市 ,使用者可以更加方便地連 接網路,運營商的制約減少。隨著 EDGE、HSDPA 這些2G 至 3G 行動網路的逐步過渡和提升,手機隨意接入網路已不是運營商口中的笑談,當你可以通過手機 IM軟體方便地進行即時聊天時,再回想不久前天價的彩信和圖鈴下載業務,是不是像噩夢一樣?網際網路巨頭Google 推動的 Android 終端天生就有網路特色,將讓使用者離網際網路更近。
- 三、豐富的硬體選擇 這一點還是與 Android 平臺的開放性相關,由於 Android 的開放性,眾多的廠商會推出千奇 百怪,功能特色各具的多種產品。功能上的差異和特色,卻不會影響到資料同步、甚至軟體 的相容,好比你從諾基亞 Symbian 風格手機 一下改用蘋果 iPhone ,同時還可將 Symbian 中優秀的軟體帶到iPhone上使用、聯絡人等資料更是可以方便地轉移,是不是非常方便呢?
- 四、不受任何限制的開發商 Android 平臺提供給第三方開發商一個十分寬泛、自由的環境,不會受到各種條條框框的阻擾,可想而知,會有多少新穎別緻的軟體會誕生。但也有其兩面性,血腥、暴力、情色方面的程式和遊戲如可控制正是留給 Android 難題之一。 五、無縫結合的 Google 應用 如今叱詫網際網路的 Google 已經走過10年度歷史,從搜尋巨人到全面的網際網路滲透,Google 服務如地圖、郵件、搜尋等已經成為連線使用者和網際網路的重要紐帶,而 Android 平臺手機將 無縫結合這些優秀的 Google 服務。 再說 Android 的
5 大不足:
- 一、安全和隱私 由於手機 與網際網路的緊密聯絡,個人隱私很難得到保守。除了上網過程中經意或不經意留 下的個人足跡,Google 這個巨人也時時站在你的身後,洞穿一切,因此,網際網路的深入將 會帶來新一輪的隱私危機。
- 二、首先開賣 Android 手機的不是最大運營商 眾所周知,T-Mobile 在 23日,於美國紐約釋出 了 Android 首款手機 G1。但是在北美市場, 最大的兩家運營商乃 AT&T 和 Verizon,而目前所知取得 Android 手機銷售權的僅有 T-Mobile 和 Sprint,其中 T-Mobile 的 3G 網路相對於其他三家也要遜色不少,因此,使用者 可以買賬購買 G1,能否體驗到最佳的 3G 網路服務則要另當別論了! 三、運營商仍然能夠影響到 Android 手機在國內市場,不少使用者對購得移動定製機不滿,感覺所購的手機被人塗畫了廣告一般。這樣的情況在國外市場同樣出現。Android 手機的另一發售運營商 Sprint 就將在其機型中內建其 手機商店程式。
- 四、同類機型使用者減少 在不少手機論壇都會有針對某一型號的子論壇,對一款手機的使用心得交流,並分享軟體資 源。而對於 Android 平臺手機,由於廠商豐富,產品型別多樣,這樣使用同一款機型的使用者 越來越少,缺少統一機型的程式強化。舉個稍顯不當的例子,現在山寨機氾濫,品種各異,就很少有專門針對某個型號山寨機的討論和群組,除了哪些功能異常搶眼、頗受追捧的機型以外。
- 五、過分依賴開發商缺少標準配置 在使用 PC 端的 Windows Xp 系統的時候,都會內建微軟 Windows Media Player 這樣一個 瀏覽器程式,使用者可以選擇更多樣的播放器,如 Realplay 或暴風影音等。但入手開始使用 預設的程式同樣可以應付多樣的需要。在 Android 平臺中,由於其開放性,軟體更多依賴第 三方廠商,比如 Android 系統的 SDK 中就沒有內建音樂 播放器,全部依賴第三方開發,缺 少了產品的統一性。
10、Android dvm的程式和Linux的程式, 應用程式的程式是否為同一個概念
DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程式中執行,都擁 有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux 中的一個程式,所以說可以認 為是同一個概念。
11、sim卡的EF檔案是什麼?有何作用
sim卡的檔案系統有自己規範,主要是為了和手機通訊,sim本 身可以有自己的操 作系統,EF就是作儲存並和手機通訊用的
12、嵌入式作業系統記憶體管理有哪幾種, 各有何特性
頁式,段式,段頁,用到了MMU,虛擬空間等技術
複製程式碼
13、什麼是嵌入式實時作業系統, Android 作業系統屬於實時作業系統嗎?
嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的 速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系 統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用 於工業控制、軍事裝置、 航空航天等領域對系統的響應時間有苛刻的要求,這 就需要使用實時系統。又可分為軟實時和硬實時兩種,而 android 是基於 linux 核心的,因此屬於軟實時。
14、一條最長的簡訊息約佔多少byte?
中文70(包括標點),英文160,160個位元組。
15、有一個一維整型陣列int[]data儲存的是一張寬為width,高為height的圖 片畫素值資訊。請寫一個演算法,將該圖片所有的白色不)畫素點透明(0xffffffff 的透明度調整為50%。
16、如何將SQLite資料庫(dictionary.db檔案)與apk檔案一起釋出
可以將dictionary.db檔案複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將dictionary.db檔案 複製到res aw目錄中
17、如何將開啟res aw目錄中的資料庫檔案?
在 Android 中不能直接開啟 res aw 目錄中的資料庫檔案,而需要在程式第一次啟動時 將該檔案複製到手機記憶體或 SD 卡的某個目錄中,然後再開啟該資料庫檔案。 複製的基本方法是使用 getResources().openRawResource 方法獲得 res aw 目錄中資源的InputStream 物件,然後將該 InputStream物件中的資料寫入其他的目錄中相應檔案中。在 Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase 方法來開啟任意目錄中 的 SQLite 資料庫檔案。
18、DDMS和TraceView的區別?
DDMS是一個程式執行檢視器,在裡面可以看見執行緒和堆疊等資訊,TraceView是 程式效能分析器
19、java中如何引用本地語言 可以用JNI(java native interface java 本地介面)介面
20、談談Android的IPC(程式間通訊)機制
- IPC 是內部程式通訊的簡稱,是共享"命名管道"的資源。
- Android 中的 IPC 機制是為了 讓 Activity 和 Service 之間可以隨時的進行互動,故在 Android 中該機制,只適用於 Activity 和 Service 之間的通訊,類似於遠端方法呼叫,類似於 C/S 模式的訪問。
- 通過定義 AIDL 接 口檔案來定義 IPC 介面。Servier 端實現 IPC 介面,Client 端呼叫 IPC 介面本地代理。
21、NDK 是什麼
- NDK 是一些列工具的集合
- NDK 提供了一系列的工具,幫助開發者迅速的開發 C/C++的動 態庫
- 並能自動將 so 和 java 應用打成 apk 包。 - NDK 整合了交叉編譯器,並提供了相應的 mk檔案和隔離 cpu、平臺等的差異
- 開發人員 只需簡單的修改 mk檔案就可以建立出 so
22.一道簡單不易的演算法題
int a = 10;
int b=5;
怎麼在不引入其他變數的情況下,讓a和b互換?
```
public class Test {
int a = 10;
int b=5;
public static void main(String[] args) {
a = a+b;
b=a-b;
a =a-b;
System.out.println("b="+b);
System.out.println("a="+a);
}
}
----輸出:
b=10
a=5
```
複製程式碼
23.你最近幾年的計劃是什麼?
24.你的專案中遇到了比較難以解決的問題?你又是如何解決的? (提示:考察的是你分析問題和解決問題的能力)
25.一些框架基本原理,設計模式的優勢。
26.自我介紹,(邏輯清晰,不可自我矛盾)
27.你寫過那些自定義元件?說一說是怎麼使用的?
27.tinker熱修復的基本原理 : 一定要形成自己的話術
28.效能優化
29.JVM和Dalvik虛擬機器的工作原理
30.APP的啟動過程
部分答案為整理,見後續!
關於更多
相信自己,沒有做不到的,只有想不到的
微信公眾號:終端研發部