Android面試題程序篇
Android面試題程序篇,由本人整理彙總,後續將推出系列篇,如果喜歡請持續關注和推薦。
作業系統程序和執行緒的區別
-
1.簡而言之,一個程式至少有一個程序,一個程序至少有一個執行緒.
-
2.執行緒的劃分尺度小於程序,使得多執行緒程式的併發性高。
-
3.另外,程序在執行過程中擁有獨立的記憶體單元,而多個執行緒共享記憶體,從而極大地提高了程式的執行效率。
-
4.多執行緒的意義在於一個應用程式中,有多個執行部分可以同時執行。有將多個執行緒看做多個獨立的應用,來實現程序的排程和管理以及資源分配
Handler、Looper訊息佇列模型,各部分的作用
-
1.MessageQueue:讀取會自動刪除訊息,單鏈表維護,在插入和刪除上有優勢。在其next()中會無限迴圈,不斷判斷是否有訊息,有就返回這條訊息並移除。
-
2.Looper:Looper建立的時候會建立一個MessageQueue,呼叫loop()方法的時候訊息迴圈開始,loop()也是一個死迴圈,會不斷呼叫messageQueue的next(),當有訊息就處理,否則阻塞在messageQueue的next()中。當Looper的quit()被呼叫的時候會呼叫messageQueue的quit(),此時next()會返回null,然後loop()方法也跟著退出。
-
3.Handler:在主執行緒構造一個Handler,然後在其他執行緒呼叫sendMessage(),此時主執行緒的MessageQueue中會插入一條message,然後被Looper使用。
-
4.系統的主執行緒在ActivityThread的main()為入口開啟主執行緒,其中定義了內部類Activity.H定義了一系列訊息型別,包含四大元件的啟動停止。
-
5.MessageQueue和Looper是一對一關係,Handler和Looper是多對一
談談你對binder機制的理解?
binder是一種IPC機制,程序間通訊的一種工具. Java層可以利用aidl工具來實現相應的介面.
Android中程序間通訊有哪些實現方式?
由於應用程式之間不能共享記憶體。在不同應用程式之間互動資料(跨程序通訊),在Android SDK中提供了4種用於跨程序通訊的方式。這4種方式正好對應於android系統中4種應用程式元件:Activity、Content Provider、Broadcast和Service:
-
Activity可以跨程序呼叫其他應用程式的Activity;
-
ContentProvider可以跨程序訪問其他應用程式中的資料(以Cursor物件形式返回), 當然,也可以對其他應用程式的資料進行增、刪、改操作;
-
Broadcast可以向android系統中所有應用程式傳送廣播, 而需要跨程序通訊的應用程式可以監聽這些廣播;
-
Service和Content Provider類似,也可以訪問其他應用程式中的資料, 但不同的是,ContentProvider返回的是Cursor物件, 而Service返回的是Java物件,這種可以跨程序通訊的服務叫AIDL服務。
android的IPC通訊方式,執行緒(程序間)通訊機制有哪些
-
1.ipc通訊方式:binder、contentprovider、socket
-
2.作業系統程序通訊方式:共享記憶體、socket、管道
描述一次跨程序通訊
-
1.client、proxy、serviceManager、BinderDriver、impl、service
-
2.client發起一個請求service資訊的Binder請求到BinderDriver中,serviceManager發現BinderDiriver中有自己的請求 然後將clinet請求的service的資料返回給client這樣完成了一次Binder通訊
-
3.clinet獲取的service資訊就是該service的proxy,此時呼叫proxy的方法,proxy將請求傳送到BinderDriver中,此時service的 Binder執行緒池迴圈發現有自己的請求,然後用impl就處理這個請求最後返回,這樣完成了第二次Binder通訊
-
4.中間client可掛起,也可以不掛起,有一個關鍵字oneway可以解決這個
Android開發中何時使用多程序?使用多程序的好處是什麼?
要想知道如何使用多程序,先要知道Android裡的多程序概念。一般情況下,一個應用程式就是一個程序,這個程序名稱就是應用程式包名。我們知道程序是系統分配資源和排程的基本單位,所以每個程序都有自己獨立的資源和記憶體空間,別的程序是不能任意訪問其他程序的記憶體和資源的。
如何讓自己的應用擁有多個程序?
很簡單,我們的四大元件在AndroidManifest檔案中註冊的時候,有個屬性是android:process,1.這裡可以指定元件的所處的程序。預設就是應用的主程序。指定為別的程序之後,系統在啟動這個元件的時候,就先建立(如果還沒建立的話)這個程序,然後再建立該元件。你可以過載Application類的onCreate方法,打印出它的程序名稱,就可以清楚的看見了。再設定android:process屬性時候,有個地方需要注意:如果是android:process=”:deamon”,以:開頭的名字,則表示這是一個應用程式的私有程序,否則它是一個全域性程序。私有程序的程序名稱是會在冒號前自動加上包名,而全域性程序則不會。一般我們都是有私有程序,很少使用全域性程序。
如何保證Service不被殺死?
從3個層面入手:
-
A.提供程序優先順序,降低程序被殺死的概率:
-
方法一:監控手機鎖屏解鎖事件,在螢幕鎖屏時啟動1個畫素的 Activity,在使用者解鎖時將 Activity 銷燬掉。
-
方法二:啟動前臺service。
-
方法三:提升service優先順序: 在AndroidManifest.xml檔案中對於intent-filter可以通過android:priority = "1000"這個屬性設定最高優先順序,1000是最高值,如果數字越小則優先順序越低,同時適用於廣播。
-
-
B. 在程序被殺死後,進行拉活:
-
方法一:註冊高頻率廣播接收器,喚起程序。如網路變化,解鎖螢幕,開機等
-
方法二:雙程序相互喚起。
-
方法三:依靠系統喚起。
-
方法四:onDestroy方法裡重啟service:service +broadcast 方式,就是當service走ondestory的時候,傳送一個自定義的廣播,當收到廣播的時候,重新啟動service;
-
-
C. 依靠第三方根據終端不同:
-
在小米手機(包括 MIUI)接入小米推送、華為手機接入華為推送;其他手機可以考慮接入騰訊信鴿或極光推送與小米推送做 A/B Test。
-
講一下android中程序的優先順序?
前臺程序 可見程序 服務程序 後臺程序 空程序
應用常駐後臺,避免被第三方殺掉的方法
-
Service設定成START_STICKY kill 後會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
-
通過 startForeground將程序設定為前臺程序, 做前臺服務,優先順序和前臺應用一個級別,除非在系統記憶體非常缺,否則此程序不會被 kill
-
雙程序Service: 讓2個程序互相保護對方,其中一個Service被清理後,另外沒被清理的程序可以立即重啟程序
-
用C編寫守護程序(即子程序) : Android系統中當前程序(Process)fork出來的子程序,被系統認為是兩個不同的程序。當父程序被殺死的時候,子程序仍然可以存活,並不受影響(Android5.0以上的版本不可行)
-
聯絡廠商,加入白名單
如果喜歡本文章,請關注Android高階程式設計微信公眾號,有更多精彩內容提供: