目錄
4)Activity在有Dialog時按Home鍵的生命週期?
5)兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
10)Android Binder機制是做什麼的,爲什麼選用Binder?
(一)Android基礎
1)四大組件?
Activity【活動】:用於表現功能。
Service【服務】:後臺運行服務,不提供界面呈現。
BroadcastReceiver【廣播接收器】:用來接收廣播。
Content Provider【內容提供商】:支持在多個應用中存儲和讀取數據,相當於數據庫。
2)Activity和Fragment的生命週期?
Activity生命週期圖
Fragment生命週期圖
Activity和Fragment生命週期對比圖
3)Activity的四種啓動模式對比?
Standard:
標準的啓動模式,如果需要啓動一個activity就會創建該activity的實例。也是activity的默認啓動模式。
SingeTop:
如果啓動的activity已經位於棧頂,那麼就不會重新創建一個新的activity實例。而是複用位於棧頂的activity實例對象。如果不位於棧頂仍舊會重新創建activity的實例對象。
SingleTask:
設置了singleTask啓動模式的activity在啓動時,如果位於activity棧中,就會複用該activity,這樣的話,在該實例之上的所有activity都依次進行出棧操作,即執行對應的onDestroy()方法,直到當前要啓動的activity位於棧頂。一般應用在網頁的圖集,一鍵退出當前的應用程序。
SingleInstance:
如果使用singleInstance啓動模式的activity在啓動的時候會複用已經存在的activity實例。不管這個activity的實例是位於哪一個應用當中,都會共享已經啓動的activity的實例對象。使用了singlestance的啓動模式的activity會單獨的開啓一個共享棧,這個棧中只存在當前的activity實例對象。
4)Activity在有Dialog時按Home鍵的生命週期?
當我們的Activity上彈出Dialog對話框時,程序的生命週期依然是onCreate() ---> onStart() ---> onResume(),在彈出Dialog的時候並沒有onPause()和onStop()方法。而在此時我們按下Home鍵,纔會繼續執行onPause()和onStop()方法。這說明對話框並沒有使Activity進入後臺,而是在點擊了Home鍵後Activity才進入後臺工作。
原因就是,其實Dialog是Activity的一個組件,此時Activity並不是不可見,而是被Dialog組件覆蓋了其他的組件,此時我們無法對其他組件進行操作而已。
5)兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
首先定義兩個Activity,分別爲A和B。
當我們在A中激活B時,A調用onPause()方法,此時B出現在屏幕時,B調用onCreate()、onStart()、onResume()。
這個時候B【B不是一個透明的窗體或對話框的形式】已經覆蓋了A的窗體,A會調用onStop()方法。
6)Service的啓動方法與生命週期?
首先Service有兩種啓動方式,而在這兩種啓動方式下,它的生命週期不同。
Service啓動方法:
- startService():開啓Service,調用者退出後Service仍然存在。
- bindService():開啓Service,調用者退出後Service也隨即退出。
Service生命週期:
- 只用startService()啓動服務:onCreate() -> onStartCommand() -> onDestory
- 只用bindService()綁定服務:onCreate() -> onBind() -> onUnBind() -> onDestory
- 同時使用startService()啓動服務與bindService()綁定服務:onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory
7)廣播分爲哪幾種,應用場景是什麼?
普通廣播:調用sendBroadcast()發送,最常用的廣播。
有序廣播:調用sendOrderedBroadcast(),發出去的廣播會被廣播接受者按照順序接收,廣播接收者按照Priority屬性值從大-小排序,Priority屬性相同者,動態註冊的廣播優先,廣播接收者還可以選擇對廣播進行截斷和修改。
8)廣播的兩種註冊方式有什麼區別?
靜態註冊:常駐系統,不受組件生命週期影響,即便應用退出,廣播還是可以被接收,耗電、佔內存。
動態註冊:非常駐,跟隨組件的生命變化,組件結束,廣播結束。在組件結束前,需要先移除廣播,否則容易造成內存泄漏。
9)廣播發送和接收的原理?
繼承BroadcastReceiver,重寫onReceive()方法。
通過Binder機制向ActivityManagerService註冊廣播。
通過Binder機制向ActivityMangerService發送廣播。
ActivityManagerService查找符合相應條件的廣播(IntentFilter/Permission)的BroadcastReceiver,將廣播發送到BroadcastReceiver所在的消息隊列中。
BroadcastReceiver所在消息隊列拿到此廣播後,回調它的onReceive()方法。
10)Android Binder機制是做什麼的,爲什麼選用Binder?
做什麼?
Android Binder是用來做進程通信的,Android的各個應用以及系統服務都運行在獨立的進程中,它們的通信都依賴於Binder。
爲什麼?
爲什麼選用Binder,我們知道Android也是基於Linux內核,Linux現有的進程通信手段有以下幾種:
管道:在創建時分配一個page大小的內存,緩存區大小比較有限;
消息隊列:信息複製兩次,額外的CPU消耗;不合適頻繁或信息量大的通信;
共享內存:無須複製,共享緩衝區直接付附加到進程虛擬地址空間,速度快;但進程間的同步問題操作系統無法實現,必須各進程利用同步工具解決;
套接字:作爲更通用的接口,傳輸效率低,主要用於不通機器或跨網絡的通信;
信號量:常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。6. 信號: 不適用於信息交換,更適用於進程中斷控制,比如非法內存訪問,殺死某個進程等;
既然有現有的IPC方式,爲什麼重新設計一套Binder機制呢。主要是出於以上三個方面的考量:
高性能:從數據拷貝次數來看Binder只需要進行一次內存拷貝,而管道、消息隊列、Socket都需要兩次,共享內存不需要拷貝,Binder的性能僅次於共享內存。
穩定性:上面說到共享內存的性能優於Binder,那爲什麼不適用共享內存呢,因爲共享內存需要處理併發同步問題,控制負責,容易出現死鎖和資源競爭,穩定性較差。而Binder基於C/S架構,客戶端與服務端彼此獨立,穩定性較好。
安全性:我們知道Android爲每個應用分配了UID,用來作爲鑑別進程的重要標誌,Android內部也依賴這個UID進行權限管理,包括6.0以前的固定權限和6.0以後的動態權限,傳榮IPC只能由用戶在數據包裏填入UID/PID,這個標記完全是在用戶空間控制的,沒有放在內核空間,因此有被惡意篡改的可能,因此Binder的安全性更高。