1. 程式人生 > >Android面試題程序篇

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:

  1. Activity可以跨程序呼叫其他應用程式的Activity;

  2. ContentProvider可以跨程序訪問其他應用程式中的資料(以Cursor物件形式返回), 當然,也可以對其他應用程式的資料進行增、刪、改操作;

  3. Broadcast可以向android系統中所有應用程式傳送廣播, 而需要跨程序通訊的應用程式可以監聽這些廣播;

  4. 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中程序的優先順序? 

前臺程序 可見程序 服務程序 後臺程序 空程序

應用常駐後臺,避免被第三方殺掉的方法 

  1. Service設定成START_STICKY kill 後會被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣

  2. 通過 startForeground將程序設定為前臺程序, 做前臺服務,優先順序和前臺應用一個級別,除非在系統記憶體非常缺,否則此程序不會被 kill

  3. 雙程序Service: 讓2個程序互相保護對方,其中一個Service被清理後,另外沒被清理的程序可以立即重啟程序

  4. 用C編寫守護程序(即子程序) : Android系統中當前程序(Process)fork出來的子程序,被系統認為是兩個不同的程序。當父程序被殺死的時候,子程序仍然可以存活,並不受影響(Android5.0以上的版本不可行)

  5. 聯絡廠商,加入白名單

如果喜歡本文章,請關注Android高階程式設計微信公眾號,有更多精彩內容提供: