android啟動模式的應用
A. Android —— Activity的四種啟動模式
除了Activity的生命周期外,Activity的啟動模式也是一個難點,有時候為了滿足項目的特殊需求,就必須使用Activity的啟動模式。
在默認情況下,當我們多次啟動同一個Activity的時候,系統會創建多個實例並把它們放入任務棧中,但是有些場景重復創建多個實例,是沒有必要且浪費資源的,這就需要啟動模式來修改系統的默認行為。
下面,我將以理論+實踐的形式為大家介紹Activity的啟動模式。
這是系統的默認啟動模式,採用這種模式的Activity無論是否已經存在實例,都會重新創建一個實例,在這種模式下誰啟動了這個Activity,那麼這個Activity就運行在啟動它的那個Activity所在的棧中。
實踐:MainActivity 採用 standard 模式
在這種模式下,如果新的Activity已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時它的 NewIntent 方法將會被回調。如果新Activity的實例已存在但不是位於棧頂,那麼新Activity依然會被創建。
實踐:MainActivity 採用 singleTop 模式
MainActivity 採用 singleTop 模式,SecondActivity採用 standard 模式
這是一種單實例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity都不會重新創建實例,而是回調 onNewIntent() 。
實踐:MainActivity 採用 singleTask 模式
MainActivity 採用 singleTask 模式,SecondActivity採用 standard 模式
這是一種加強的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,還加強了一點,那就是具有此模式的Activity只能單獨的位於一個任務棧中。
實踐:MainActivity 採用 singleInstance 模式
MainActivity 採用 singleInstance 模式,SecondActivity採用 standard 模式
以上就是Activity啟動模式的介紹。
歡迎留言指出錯誤。
B. android 主界面一般用什麼啟動模式
我常用的是使用single單例模式,因為這樣可以節省不必要的初始化動作
C. Android N「直接啟動」是什麼神奇的功能
從 Android N 開始,在首次開機時,在用戶尚未來得及解鎖設備之前,設備可直接啟動到一種名為 Direct Boot(直接啟動)的新模式中。在此模式下,操作系統可以全功能運行,但不允許訪問私有應用數據,只能運行經過更新、可支持直接啟動功能的應用。
直接啟動適合我的應用嗎?並非所有應用都應運行在直接啟動模式下,因此,在開始編碼之前,請務必先檢查您的應用是否符合以下常見的用例:
安排鬧鈴的應用,如鬧鍾。
提供重要且及時的通知的應用,如簡訊應用。
為其他應用或系統提供服務的應用,例如輔助工具服務。
請注意,以上並非詳盡的用例列表,我們期待看到還有哪些類型的應用能夠從直接啟動模式獲益。
讓您的應用支持直接啟動
為了讓您的應用能夠在用戶解鎖設備之前運行,您必須在清單文件中將組件顯式標記為支持直接啟動:
<activity|provider|receiver|service ...
android:directBootAware=」true」>
您可以選擇您的應用中需要支持直接啟動的組件子集,但如果您使用的是自定義 Application 類,則假定應用內部標記為支持直接啟動的任何組件均支持直接啟動。對於需要在直接啟動模式下在系統啟動之後盡快運行的應用,現在提供一種新的 Intent.ACTION_LOCKED_BOOT_COMPLETED 廣播。在用戶解鎖該設備之後,所有應用仍將收到 Intent.ACTION_BOOT_COMPLETED 廣播。
使用設備保護存儲區為了支持應用在用戶提供解鎖私有應用數據所需的憑據之前的正常運行,所有 Android N 設備現在均提供兩個數據存儲位置:
憑據保護存儲區,這是所有應用的默認存儲位置,僅在用戶解鎖設備後可用。
設備保護存儲區,這是一個新的存儲位置,當設備啟動後(包括直接啟動期間)隨時都可訪問該位置。
應用中被標記為支持直接啟動的組件必須使用設備保護存儲區來存儲直接啟動模式期間應用操作所需的任何數據。在用戶解鎖設備後,用戶仍可訪問憑據保護存儲區。
要訪問設備保護存儲區,您需要為所有文件相關的 API 另外創建並使用一個 Context 對象:
Context deviceProtectedContext = context.();
deviceProtectedContext.openFileInput( ... )
當您的應用更新到支持直接啟動的版本之後,您之前保存的共享首選項
或資料庫可能需要遷移到設備保護存儲區。在訪問該存儲區之前,即使數據已從舊版本或其他設備中備份並恢復,您仍應使
用 Context.moveSharedPreferencesFrom() 和
Context.moveDatabaseFrom(),以確保應用能夠繼續正常運行。
注意事項
您
應審慎考慮要在設備保護存儲區中存儲哪些數據。應盡量減少在設備保護存儲區中存儲的數據,以確保您的應用在直接啟動期間正常運行為限。例如,在簡訊應用
中,您可以存儲一個訪問令牌,其作用域僅限於能夠訪問伺服器上的新消息數量。所有敏感的私人信息(例如完整的簡訊歷史記錄和讀/寫訪問令牌)仍應保存在憑
據保護存儲區中。
另外需要提醒的一點是:在直接啟動期間,應用只能訪問其他支持直接
啟動的應用和組件。如果您的應用依賴外部服務和 Activity,請確保妥善處理外部服務和 Activity
不可用的情形。默認情況下,Intent 過濾器僅匹配當前用戶狀態(已鎖定/已解鎖)下可用的組件。現在有兩個新的標志,可用於向 Package
Manager
顯式聲明需要枚舉哪些組
件:PackageManager.MATCH_DIRECT_BOOT_AWARE 和 PackageManager.MATCH_DIRECT_BOOT_UNAWARE。
未來計劃
在
原生支持直接啟動的 Android N 設備發布之前,您可以使用 Android N 開發者預覽版測試您的應用。在 Nexus 5X 和
Nexus 6P 上,您可以通過使用 Settings > Developer options > Convert to file
encryption 來擦除所有用戶數據並啟用完整的直接啟動模式。或者,您也可以重新啟動到引導裝載程序並發出相應的快速啟動命令:
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
警告:這兩種方法都將執行恢復出廠設置並刪除設備中的所有用戶數據。
或者,您也可以使用模擬的直接啟動模式。若要啟用模擬直接啟動模式,請在設備上設置鎖定模式,如果在設置鎖定模式時系統提示安全啟動屏幕,則選擇「No thanks」,然後使用以下 adb shell 命令啟用和禁用模擬:
$ adb shell sm set-emulate-fbe true
$ adb shell sm set-emulate-fbe false
請注意,使用這些命令會導致設備重啟。您只應在測試設備上使用模擬直接啟動模式,因為該模式可能導致數據丟失。
D. Android四種啟動模式在什麼時候使用
standard(默認)
系統默認的啟動模式。
Android是使用返回棧來管理活動的,在standard模式下,每當啟動一個新的活動,它就會在返回棧中入棧,並處於棧頂的位置。
對於使用standard模式的活動,系統不會在乎這個活動是否已經在返回棧中存在,而是每次啟動活動都會創建該活動的一個新的實例。
singleTop
android:launchMode="singleTop"
當活動的啟動模式指定為singleTop,在啟動活動時,如果發現該返回棧的棧頂已經是該活動時,則認為可以直接使用它,不會在創建新的活動實例
singleTask
當活動的啟動模式指定為singleTask,每次啟動該活動時,首先會在返回棧中檢查是否存在該活動的實例,如果發現已經存在就直接使用該實例,並把這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例。
android:launchMode="singleTask"
singleInstance
指定為singleInstance模式的活動會啟用一個新的返回棧來管理這個活動,不管是哪個應用程序來訪問這個活動,都共用的同一個返回棧,解決了共享活動實例的問題
修改SecondActivity的啟動模式
android:launchMode="singleInstance"
使用方式:
standard:怎麼樣都要創建
singleTop:頂上不是target Activity,new一個
singleTask:頂上不是target Activity,移除target之上的,把自己變成top。
singleInstance:開辟私有的task,完全獨立於程序的其他activity的task。
使用場景:
standard:普通activity
singleTop:要展示推送過來的消息
singleTask:程序入口等啟動頁面
singleInstance:完全獨立的,類似鬧鍾的提示