安卓四種啟動模式 - CSDN

2021-01-18 CSDN技術社區

大家都知道,安卓有四種啟動模式,使用的時候在清單文件配置一下就好了。但是如果你對四種啟動模式認識不深,後面是要吃大虧的!有些需求場景本來是可以簡單實現的,但是卻被各自需求邏輯搞複雜。我之前遇到一個問題是,點擊手機桌面圖標,打開的Activity總是啟動頁,當時以為是因為我們把啟動頁這個Activity設置成了LauchActivity導致的,所以我把MainActivity設置成了LauchActivity,導致每次點擊桌面圖標首先打開MainActivity,然後去啟動SplashActivity,這樣做是非常消耗內存的,所以我們的項目上線之後在啟動頁加載廣告圖的時候造成內存溢出了!後來想想原來是自己對Activity的啟動模式和Android任務棧認識不深導致的。
首先,我們點擊桌面應用圖標,一定打開的是我們設置為LauchActivity的那個Activity,然後在根據業務邏輯進行調轉到相應的Activity。當你的SplashActivity的啟動模式設置成SingleTask或者SingleInstance啟動模式,並且這個Activity還是LauchActivity,那麼當你程序退出到後臺,再次點擊桌面圖標,程序打開的還是SplashActivity,而你之前在任務棧還沒有調用finish()的Activity,已經因為你設置的啟動模式,而強行清棧了!這就是我說的很坑的地方,改動一處,已經影響了之前的業務邏輯。
那麼現在我們就要來聊一聊安卓的啟動模式了。
這裡有比較好的博客可以參考一下:
http://blog.csdn.net/shinay/article/details/7898492/
但是為了加深自己的理解,所以我決定自己做一下實驗:
準備材料:安卓開發工具、一個新的項目工程、三個功能相同並列印各種生命周期的Activity.
首先我們看Standard啟動模式:它允許Activity重複添加,如果你想讓跳轉之前的Activity出棧,需要手動的調用跳轉之前的Activity的finish()方法。

我們會發現FristActivity的onPause()方法會在SecondActivity調用onCreate()方法之前調用,而onSaveInstanceState()和onStop()會在FristActivity創建之後調用。
SingleTop啟動模式
實驗場景:1)三個功能相同的Activity,並列印各自的生命周期方法,把SecondActivity設置為SingleTop啟動模式。2)我們首先從FristAcitity跳轉到SecondActivity,接著跳轉到ThirdActivity,然後再從ThirdActivity跳轉到FristActivity,再跳SecondActivity來觀察SecondActivity的生命周期方法。
實驗現象:1)我們會發現每次跳轉SecondActivity的生命周期調用和Sandard啟動模式是一致的。
2)當我把SecondActivity設置成跳轉到當前的顯示界面的時候,如下圖:

點擊當前SecondAtivity的跳轉按鈕,發現調用了SecondActivity的如下生命周期方法:

我們發現當SecondActivity設置成SingleTop啟動模式的時候,重複跳轉到自己,如果自己在棧頂的話,它就不會重新創建自己,而是復用了當前處在棧頂的Activity,並調用onPause()、onNewIntent()、onResume()、onPostResume()四個方法。
為了進行對比,我們現在讓FristActivity重複的跳轉到自己,列印的生命周期如下:

我們會發現Standard啟動模式的Activity並沒有復用自己,而是重新走了一遍生命周期方法,也說明它是允許Activity疊加的!
3)SingleTop 可以有多個實例,但是不允許多個相同Activity疊加。如果該Activity不在棧頂,則創建新的實例,在棧頂則復用,並調用onNewIntent()方法。這種啟動模式通常適用於接受到消息後顯示的界面,例如QQ接受到消息後彈出Activity,如果一次來10條消息,總不能一次彈10個Activity。
SingleTask模式
實驗場景:1)材料和上面一樣,現在我們把SecondActivity設置成SingleTask啟動模式,並從1–>2–>3—>1—>2這樣進行Activity調轉。
實驗現象:1)發現正常的從1–>2—>3生命周期方法和Standard啟動模式一模一樣。
2)當從3–>1–>2Activity進行跳轉的時候,SecondActivity調用了如下生命周期方法。

我們發現,SingleTask啟動的Activity在發現自己在任務棧有實例時,會復用之前的實例,並調用onNewIntent()、onRestart()、onStart()、onResume()、onPostResume()五個生命周期方法。
3)設置SingleTask啟動模式的Activity會調用在任務棧上面activity的onDestroy方法,把前面的Activity清出任務棧,直到自己處在棧頂,後面的Activity的位置保持不變。
4)設置SingleTask啟動模式的Activity一個任務棧只存在一份實例,這就是它和SingleTop的區別.
5)SingleTask只有一個實例。在同一個應用程式中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
SingleInstance模式
實驗場景:1)實驗材料和上面相同,我們把SecondActivity的啟動模式設置成singleInstance啟動模式。
2)在每個Activity的onCreate()方法中加如下代碼:

Log.e(">>>>>>>>>>>>>>>>>"+TAG,"onCreate()"+"TaskId"+getTaskId());

實驗現象:1)首先從FristActivity跳轉到SecondActivity時我們發現除了onCreate()方法列印的日誌不一樣外,其他的生命周期方法和Sandard啟動模式一模一樣,日誌列印如下:

2)我們再從SecondActivity跳轉到ThridActivity,再從ThridActivity跳轉到FristActivity,都沒有發現什麼異常,因為除了SecondActivity,其他Activity都是Sandard啟動模式。
3)當我們再從FristActivity跳轉到SecondActivity,我們發現設置SingleInstance啟動模式的Activity也會復用實例,並調用onNewIntent()、onRestart()、onStart()、onResume()、onPostResume()方法。

4)當我回退棧的時候,發現之前創建的Activity都還在任務棧內,我們從1–>2–>3–>1–>2,回退棧的時候順序是2–>1–>3–>1,發現之前的實例在第一次退棧的時候銷毀了,所以,任務棧沒有SecondActivity的實例。
5)SingleInstance和SingleTask的區別就是它實例存在於獨立的一個任務棧中,並跳轉復用實例的時候不會清之前存在於任務棧的Activity實例。
6)SingleInstance啟動的Activity允許不同的應用進程訪問,否則調用將無效。比如:第三方推送跳轉時,跳轉的Activity必須設置成SingleInstance啟動模式,否則無法打開。
最後,我們總結一下:
1)Standard模式允許Activity重複疊加。
2)SingleTop 可以有多個實例,但是不允許多個相同Activity疊加。如果該Activity不在棧頂,則創建新的實例,在棧頂則復用,並調用onNewIntent()方法。這種啟動模式通常適用於接受到消息後顯示的界面,例如QQ接受到消息後彈出Activity,如果一次來10條消息,總不能一次彈10個Activity。
3)SingleTask只有一個實例。在同一個應用程式中啟動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。
4)SingleInstance只有一個實例,並獨立使用一個任務棧,不會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。使用場景,A應用需要啟動B應用的Activity,則需要把該Activity設置成SingleInstance,比如第三方推送。

相關焦點

  • 一發不可收出自_stm32串口一發一接收 - CSDN
    MVVM是一種架構模式,而DataBinding是一個實現數據和UI綁定的框架,是構建MVVM模式的一個工具。...震驚!如此多的 Android 開發技巧!Android 你應該知道的的應用冷啟動過程分析和優化方案 - Android - 掘金你有沒有發現,點擊安卓手機桌面上的App圖標時,有時候應用馬上進入主界面,有時候要經歷好幾秒甚至更久的白屏(也可能是黑屏)時間才能進入主界面呢?這其實是安卓應用常見的冷熱啟動問題。本文就和大家一起聊聊冷熱啟動方式和啟動頁的體驗優化方案。 啟動方式 安卓應用的...
  • android啟動頁設計專題及常見問題 - CSDN
    轉載請註明出處:http://blog.csdn.net/wangjihuanghun/article/details/63255144啟動頁幾乎成為了每個app的標配,有些商家在啟動頁中增加了開屏廣告以此帶來更多的收入。
  • 微軟禁用安卓版Cortana語音啟動功能:因bug太多
    12月22日消息,據VentureBeat報導,本月初,微軟宣布Cortana正式在美國和中國登陸安卓和iOS平臺。不過這還不到半個月,微軟就不得不叫停了小娜在安卓平臺上的語音啟動功能,因為它和安卓原生的語音助手起了衝突。
  • Pokemon go安卓開飛機教程 安卓虛擬定位步驟詳解
    Pokemon go安卓版怎麼開飛機?眼看著鎖區了但是大家無能為力,怎能不使用一些黑科技呢?那麼口袋妖怪go安卓版怎麼開飛機呢?小編給大家帶來了虛擬定位開飛機的詳細教程,不過大家小心使用不要被封號。
  • 新擬態設計搭配獨立亞美AM8升級模式前瞻安卓12概念版
    進入2020年底,安卓新系統的升級更新也加快了步伐。目前,距Android 11正式版推出還有一個多月的時間。然而,就在國內很多廠商還在進行適配安卓11工作的當下,下一代安卓12系統也已經揭開神秘面紗。據悉,新擬態設計和獨立升級模式,將是安卓12的最大看點。
  • 人類的四種自駕反應模式
    人們產生負面情緒當中,在正念裡,反應是不存在必然反應的,都是慣性的反應,是人類的自駕模式。一、人類的慣性反應模式1.苦難=疼痛×抵抗(Suffering=Pain×Resistance)1)疼痛無法免除,苦難可以免除2)當生活捅你一刀,你可以不必額外再插自己一刀3)此刻無法改變,可以改變的是你的反應,以及隨之而來的未來三、第四種反應模式
  • 熊小白玩安卓04期:安卓手機與平板,也能變成電腦的擴展屏幕!
    那麼問題來了,安卓設備(安卓手機、安卓平板)上是否有一款應用程式,能夠實現類似Sidecar功能呢?答案是有的,它的名字叫做:Xdisplay,該軟體可以通過數據線將安卓設備(安卓手機、安卓平板)變成電腦的擴展屏幕。
  • 安卓Q新增原生桌面模式:手機連接顯示器變主機 心疼老羅!
    據悉,谷歌在安卓Q中新增了原生桌面模式,添加了多屏任務處理的功能,一方面是為了適配可摺疊設備,另一方面也是為了讓安卓系統連接顯示器時能夠自動適應大屏幕顯示。  谷歌已經在最新的安卓Q測試版中增加了原生桌面模式。
  • B肝在研新藥安卓奎諾爾和啟動2期隨機雙盲
    B肝在研新藥安卓奎諾爾,單一小分子誘導凋亡,啟動2期隨機雙盲早在2009年,發表於國際學術期刊(Biochemical Pharmacology)的藥物學文獻表明,Antroquinonol (安卓奎諾爾)為單一小分子藥物對癌細胞周期當中的G1具有良好抑制作用,主要原理為通過AMPK的活化並對mTOR轉譯路徑有效抑制,形成一連串的對癌細胞的抑制凋亡。
  • 鳳凰系統--用安卓打造的個人電腦系統
    2016年新年伊始,北京超卓科技有限公司發布了面向平板、筆記本電腦、臺式機的全新桌面作業系統——「鳳凰作業系統」(PhoenixOS),該系統基於安卓平臺深度研發,不僅延續了已成經典的個人電腦作業系統體驗模式,同時也完全兼容安卓生態的軟硬體產品,給不溫不火的後PC時代的桌面端市場,注入了新年裡的新氣象
  • 安卓螞蟻森林能量腳本V1.3-無需ROOT+支持模擬器
    安卓螞蟻森林能量腳本-無障礙模式,無需Root權限功能收自己+偷列表收別人澆給自己的水幫列表收能量模式定時模式 (手動定時啟動腳本)掛機模式 (循環掛機運行腳本)自動模式 (自動檢測好友能量成熟剩餘時間並定時運行腳本)以上為已完成的功能(自動模式未添加)
  • 扭轉戰局的棋子 安卓4.4 ART模式實測解析
    ,而ART模式的出現絕對是Android系統一個重要的轉折點,那麼這個ART模式到底是什麼?安卓4.4 ART模式實測解析    如果要解釋清楚什麼是ART模式,我們就需要從Android系統的應用編譯模式說起
  • STM32 的三種不同啟動模式
    STM32三種啟動模式對應的存儲介質均是晶片內置的,它們是:1. 用戶快閃記憶體:晶片內置的Flash。2. SRAM:晶片內置的RAM 區,就是內存啦。3.
  • 盤點iOS12和安卓9.0相互學習了哪些特性
    iOS12的新勿擾模式其實在一定程度上,和安卓的勿擾模式比較類似,安卓的勿擾模式很早就可以方便地設置定時開關,也可以根據規則條件自動起作用。這套好用的勿擾模式設計,iOS12可算是學到家了。在iOS12當中,分屏模式終於來到了更多的iOS設備之上,iPhone當中也可以同時顯示兩個APP,一邊看視頻一邊聊天再也不成問題了。iOS12終於支持手機的分屏模式了這個特性並不是iOS引領的,在安卓當中,分屏模式已經早早出現。Google在安卓7.0中為系統提供了分屏模式支持,只要APP符合規範,那麼就可以在屏幕當中以分屏的形式呈現。
  • 旗魚瀏覽器安卓版 2.0 發布:新!
    網址鍵盤輔助欄排版錯亂問題修正:界面 - 含HTML實體的熱搜詞顯示「亂碼」問題修正:界面 - 從主頁前進時地址欄有時不變色的問題,下拉刷新按鈕顏色與地址欄顏色同步修正:功能 - 個別情況下關閉下拉刷新時仍誤觸發的問題修正:功能 - UA設置為桌面時打開百度仍為移動版的問題修正:功能 - 只勾選「關閉後下次恢復」時,下次啟動未關閉網頁不恢復的問題
  • Firefox新版本推出 瀏覽器加入訪客模式
    在Firefox24剛剛正式發布不久後,近日Mozilla公司推出了Firefox25 beta版,為廣大安卓用戶帶來了重大更新,新版本瀏覽器為我們帶來了網頁的訪客模式。Firefox25加入訪客模式(圖片來自於engadget)    啟動訪客模式後,當訪客使用你的瀏覽器時,你的書籤和歷史記錄是被隱藏的
  • 體驗iOS與安卓裡的手機虛擬定位
    圖7 錯誤提示安卓虛擬定位應用 它能虛擬定位還能模擬走路再來說說安卓手機的虛擬定位,在安卓系統下,虛擬定位應用就多了,這裡介紹一個名叫Fake Location的虛擬定位應用,它有root模式與非root模式,當然就是root模式比較的強悍且不容易被其它應用的反虛擬定位功能所檢測到
  • 光速虛擬機-手機端安卓虛擬機,讓你再多一個手機分身【安卓】
    今天給大家帶來一款移動端安卓虛擬機App 光速虛擬機,極速啟動的免費安卓虛擬機。 之前有向小夥伴們推薦過一款安卓虛擬機-VMOS虛擬大師,但是其啟動速度不是很快,有些影響使用體驗。
  • 谷歌提前放出安卓 7.0 開發者預覽版:多窗口 + 畫中畫
    安卓7.0開發者預覽版上手體驗》IT之家訊 3月10日消息,谷歌今天向開發者正式推送了Android N開發者預覽版,這要比之前預期的早一些,一般來說都是在谷歌I/O大會上才會放出的。另外一大亮點是,安卓7.0新增了分屏多任務功能,該功能可以在平板和手機上使用。另外,安卓7.0還包括了一個畫中畫模式,類似iOS9中的功能,但谷歌目前表示該功能只是提供給Android TV使用。
  • 盤點蘋果iOS12和安卓9.0都相互學習了哪些特性
    iOS12的新勿擾模式其實在一定程度上,和安卓的勿擾模式比較類似,安卓的勿擾模式很早就可以方便地設置定時開關,也可以根據規則條件自動起作用。這套好用的勿擾模式設計,iOS12可算是學到家了。在iOS11當中,蘋果首次為行動裝置加入了分屏模式,但這模式只供iPad使用。