「面試複習」「Android」Android基礎

目錄

(一)Android基礎

1)四大組件?

2)Activity和Fragment的生命週期?

3)Activity的四種啓動模式對比?

4)Activity在有Dialog時按Home鍵的生命週期?

5)兩個Activity 之間跳轉時必然會執行的是哪幾個方法? 

6)Service的啓動方法與生命週期?

7)廣播分爲哪幾種,應用場景是什麼?

8)廣播的兩種註冊方式有什麼區別?

9)廣播發送和接收的原理?

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的安全性更高。

 

 

 

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章