99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

android啟動模式,android 四種啟動模式

Android中的Activity詳解--啟動模式與任務棧

目錄

公司主營業務:網站設計制作、成都網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯推出薩爾圖免費做網站回饋大家。

activity的簡單介紹就不寫了,作為最常用的四大組件之一,肯定都很熟悉其基本用法了。

首先,是都很熟悉的一張圖,即官方介紹的Activity生命周期圖.

情景:打開某個應用的的FirstActivity調用方法如下:

由于之前已經很熟悉了,這里就簡單貼一些圖。

按下返回鍵:

重新打開并按下home鍵:

再重新打開:

在其中打開一個DialogActivity(SecondActivity)

按下返回:

修改SecondAcitvity為普通Activity,依舊是上述操作:

這里強調一下 onSaveInstanceState(Bundle outState) 方法的調用時機:

當Activity有可能被系統殺掉時調用,注意,一定是被系統殺掉,自己調用finish是不行的。

測試如下:FirstActivity啟動SecondActivity:

一個App會包含很多個Activity,多個Activity之間通過intent進行跳轉,那么原始的Activity就是使用棧這個數據結構來保存的。

Task

A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack ), in the order in which each activity is opened.

即若干個Activity的集合的棧表示一個Task。

當App啟動時如果不存在當前App的任務棧就會自動創建一個,默認情況下一個App中的所有Activity都是放在一個Task中的,但是如果指定了特殊的啟動模式,那么就會出現同一個App的Activity出現在不同的任務棧中的情況,即會有任務棧中包含來自于不同App的Activity。

標準模式,在不指定啟動模式的情況下都是以此種方式啟動的。每次啟動都會創建一個新的Activity實例,覆蓋在原有的Activity上,原有的Activity入棧。

測試如下:在FirstActivity中啟動FirstActivity:

當只有一個FirstActivity時堆棧情況:

此種模式下,Activity在啟動時會進行判斷,如果當前的App的棧頂的Activity即正在活動的Activity就是將要啟動的Activity,那么就不會創建新的實例,直接使用棧頂的實例。

測試,設置FirstActivity為此啟動模式,多次點擊FirstActivity中的啟動FirstActivity的按鈕查看堆棧情況:

(其實點擊按鈕沒有啟動新Activity的動畫就可以看出并沒有啟動新Activity)

大意就是:

對于使用singleTop啟動或Intent.FLAG_ACTIVITY_SINGLE_TOP啟動的Activity,當該Activity被重復啟動(注意一定是re-launched,第一次啟動時不會調用)時就會調用此方法。

且調用此方法之前會先暫停Activity也就是先調用onPause方法。

而且,即使是在新的調用產生后此方法被調用,但是通過getIntent方法獲取到的依舊是以前的Intent,可以通過setIntent方法設置新的Intent。

方法參數就是新傳遞的Intent.

1.如果是同一個App中啟動某個設置了此模式的Activity的話,如果棧中已經存在該Activity的實例,那么就會將該Activity上面的Activity清空,并將此實例放在棧頂。

測試:SecondActivity啟動模式設為singleTask,啟動三個Activity:

這個模式就很好記,以此模式啟動的Activity會存放在一個單獨的任務棧中,且只會有一個實例。

測試:SecondActivity啟動模式設為singleInstance

結果:

顯然,啟動了兩次ThirdActivity任務棧中就有兩個實例,而SecondActivity在另外一個任務棧中,且只有一個。

在使用Intent啟動一個Activity時可以設置啟動該Activity的啟動模式:

這個屬性有很多,大致列出幾個:

每個啟動的Activity都在一個新的任務棧中

singleTop

singleTask

用此種方式啟動的Activity,在它啟動了其他Activity后,會自動finish.

官方文檔介紹如下:

這樣看來的話,通俗易懂的講,就是給每一個任務棧起個名,給每個Activity也起個名,在Activity以singleTask模式啟動時,就檢查有沒有跟此Activity的名相同的任務棧,有的話就將其加入其中。沒有的話就按照這個Activity的名創建一個任務棧。

測試:在App1中設置SecondActivity的taskAffinity為“gsq.test”,App2中的ActivityX的taskAffinity也設為“gsq.test”

任務棧信息如下:

結果很顯然了。

測試:在上述基礎上,在ActivityX中進行跳轉到ActivityY,ActivityY不指定啟動模式和taskAffinity。結果如下:

這樣就沒問題了,ActivityY在一個新的任務棧中,名稱為包名。

這時從ActivityY跳轉到SecondActivity,那應該是gsq.test任務棧只有SecondActivity,ActivityX已經沒有了。因為其啟動模式是singleTask,在啟動它時發現已經有一個實例存在,就把它所在的任務棧上面的Activity都清空了并將其置于棧頂。

還有一點需要提一下,在上面,FirstActivity是App1的lunch Activity,但是由于SecondActivity并沒有指定MAIN和LAUNCHER過濾器,故在FirstActivity跳轉到SecondActivity時,按下home鍵,再點開App1,回到的是FirstActivity。

大致就先寫這么多吧,好像有點長,廢話有點多,估計也有錯別字,不要太在意~~~

Android Activity啟動模式與狀態保存及恢復詳解

Activity是 Android組件 中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器)之一 。

Activity是一個應用程序 組件 ,提供一個 屏幕 ,用戶可以用來交互為了完成某項任務。

Activity中所有操作都與用戶密切相關,是一個負責與 用戶交互 的組件,可以通過setContentView(View)來 顯示指定控件 。

在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽并處理用戶的事件做出響應。Activity之間通過Intent進行通信。

關于Activity啟動流程請參考之前的文章 Android activity啟動流程分析

activity有四種啟動模式,分別為standard,singleTop,singleTask,singleInstance。如果要使用這四種啟動模式,必須在manifest文件中activity標簽中的launchMode屬性中配置。

標準的默認啟動模式,這種模式下activity可以被多次實例化,即在一個task中可以存在多個activity,每一個activity會處理一個intent對象,(在A中再次啟動A,會存在后面的A在前面的A上面,當前task會存在兩個activity的實例對象)

如果一個singleTop模式啟動的activity實例已經存在于棧頂,那么再次啟動這個activity的時候,不會重新創建實例,而是重用位于棧頂的那個實例,并且會調用實例的onNewIntent()方法將Intent對象傳遞到這個實例中,如果實例不位于棧頂,會創建新的實例。

啟動模式設置為singleTask,framework在啟動該activity時只會把它標示為可在一個新任務中啟動,至于是否在一個新任務中啟動,還要受其他條件的限制,即taskAffinity屬性。

taskAffinity :默認情況下,一個應用中的所有activity具有相同的taskAffinity,即應用程序的包名。我們可以通過設置不同的taskAffinity屬性給應用中的activity分組,也可以把不同的應用中的activity的taskAffinity設置成相同的值,當兩個不同應用中的activity設置成相同的taskAffinity時,則兩個activity會屬于同一個TaskRecord。

在啟動一個singleTask的Activity實例時,如果系統中已經存在這樣一個實例,就會將這個實例調度到任務棧的棧頂,并清除它當前所在任務中位于它上面的所有的activity;如果這個已存在的任務中不存在一個要啟動的Activity的實例,則在這個任務的頂端啟動一個實例;若這個任務不存在,則會啟動一個新的任務,在這個新的任務中啟動這個singleTask模式的Activity的一個實例。

以singleInstance模式啟動的Activity具有全局唯一性,即整個系統中只會存在一個這樣的實例,如果在啟動這樣的Activiyt時,已經存在了一個實例,那么會把它所在的任務調度到前臺,重用這個實例。

以singleInstance模式啟動的Activity具有獨占性,即它會獨自占用一個任務,被他開啟的任何activity都會運行在其他任務中(官方文檔上的描述為,singleInstance模式的Activity不允許其他Activity和它共存在一個任務中)。

被singleInstance模式的Activity開啟的其他activity,能夠開啟一個新任務,但不一定開啟新的任務,也可能在已有的一個任務中開啟,受條件的限制,這個條件是:當前系統中是不是已經有了一個activity B的taskAffinity屬性指定的任務。

涉及到Activity啟動,就不得不說一下Activity的管理,Activity是以什么方式及被什么類來進行管理的,涉及的類主要如下:

歷史棧中的一個條目,代表一個activity。ActivityRecord中的成員變量task表示其所在的TaskRecord,ActivityRecord與TaskRecord建立了聯系。

內部維護一個 ArrayListActivityRecord 用來保存ActivityRecord,TaskRecord中的mStack表示其所在的ActivityStack,TaskRecord與ActivityStack建立了聯系。

內部維護了一個 ArrayListTaskRecord ,用來管理TaskRecord,ActivityStack中持有ActivityStackSupervisor對象,由ActivityStackSupervisor創建。

負責所有ActivityStack的管理。內部管理了mHomeStack、mFocusedStack和mLastFocusedStack三個Activity棧。其中,mHomeStack管理的是Launcher相關的Activity棧;mFocusedStack管理的是當前顯示在前臺Activity的Activity棧;mLastFocusedStack管理的是上一次顯示在前臺Activity的Activity棧。

ActivityThread 運行在UI線程(主線程),App的真正入口。

用來實現AMS和ActivityThread之間的交互。

負責調用Activity和Application生命周期。

當一個Activity未被主動關閉,即“被動關閉”時,可能需要系統給用戶提供保持一些狀態的入口。

前面說的入口就是:Activity提供了onSaveInstanceState()方法,該方法是Activity在關閉前保存狀態的核心方法。

前面提到“被動關閉”,如果是主動關閉那么就不會調用,比如:按back鍵、調用finish()等,那么"被動關閉"的場景有哪些呢?下面給列舉一下:

肯定在調用onStop()前被調用,但不保證在onPause()前 / 后,一般是在onPause()后調用。

當需要保持狀態時,在onSaveInstanceState()內執行以下邏輯:

當需要恢復時,在onCreate()內部執行以下邏輯:

布局每個View默認實現:onSaveInstanceState(),即UI的任何改變都會自動的存儲和在activity重新創建的時候自動的恢復(只有在為該UI提供了唯一ID后才起作用);

若需復寫該方法從而存儲額外的狀態信息時,應先調用父類的onSaveInstanceState()(因為默認的onSaveInstanceState()幫助UI存儲它的狀態);

只使用該方法記錄Activity的瞬間狀態(UI的狀態),而不是去存儲持久化數據,因為onSaveInstanceState()調用時機不確定性;可使用 onPause()[一定會執行]存儲持久化數據;

Activity提供了onRestoreInstanceState()方法,該方法是Activity在重新創建后恢復之前保存狀態的核心方法。

若被動關閉了Activity,即調用了onSaveInstanceState(),那么下次啟動時會調用onRestoreInstanceState()。

onCreate()---onStart()---onRestoreInstanceState()---onResume()

注意: onSaveInstanceState()、onRestoreInstanceState()不一定 成對被調用

如:當正在顯示Activity A時,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到Activity A,此時Activity A一般不會因為內存的原因被系統銷毀,故Activity A的onRestoreInstanceState()不會被執行;

針對以上情況,onSaveInstanceState保持的參數可以選擇在onCreate()內部進行解析使用,因為onSaveInstanceState的bundle參數會傳遞到onCreate方法中,可選擇在onCreate()中做數據還原。

至此:Activity的啟動模式及Activity的狀態保持及恢復介紹完畢。

Android的啟動模式:singleTask與singleTop的使用

singleTop 與 singleTask 是 Activity 最常用的兩種啟動模式。本文主要講解兩者之間的區別與使用場景。

個人博客: 李益的小站

Activity 共有四種啟動模式,我們先簡單回顧一下,如想要詳細了解的,可自行網上查詢(相關文章很多哦,本文就不再詳細贅述)了。

使用 singleTop 模式的 Activity 在棧頂時只會在 Task 中存在一個實例,所以可以在以下場景中使用:

總之, singleTop 比較適用于 ChildActivity (非主架構Activity)

所以基于以上特性,比較適合主架構 Activity (例MainActivity)設置為 singleTask ,或者一些經常使用,但是關閉和跳轉不規律的 Activity

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:完全獨立的,類似鬧鐘的提示

Android: Activity啟動模式 FLAG_ACTIVITY_NEW_TASK 詳細探索

最近遇到了一個小問題,在我使用了多種Activity啟動模式的時候,重新打開其中的一個Activity會啟動另一個我已經停止的Activity,從而調用了一些已經失效的方法導致程序崩潰。

由于項目工程復雜,Activity名稱不夠直觀,我新建了一個ActivityTaskTest 工程來重現遇到的問題。

ActivityA是工程的主活動。因為一些必要的原因, ActivityA的啟動模式是SingleInstance的。ActivityA可以啟動ActivityB,ActivityB沒有設置任何啟動模式,即默認的standard啟動模式。在ActivityB中,將會啟動一個ServiceA。 ServiceA中啟動一個了一個ActivityC,由于Activity是在非Acitivity環境下啟動的,需要設置 FLAG_ACTIVITY_NEW_TASK標簽(這里就是我們討論的重點,稍候會詳細分析)。當ActivityC完成任務后會重新跳轉到ActivityA。

最后,見證奇葩的時刻到了,我們點擊ActivityA的啟動ActivityB的button,ActivityC出現在了我們的眼前,而不是ActivityB??!這一刻我仿佛劉謙附體,但在我發現我身邊并沒有董卿之后,我深刻地意識到了我是一個工程師,不能搞這些裝神弄鬼的事情。ok,Let's find out what‘s going on with our precious app!

關于Activity啟動模式和Activity Task的內容推薦一篇非常好的文章: Android中Activity四種啟動模式和taskAffinity屬性詳解 。這篇文章已經講得非常詳細了,這里就不再贅述了,偷個懶哈哈。

如果你已經看了文章,你應該已經知道問題的所在了,對,就是這個該死的taskAffinity。簡單的說,就是我們雖然使用了FLAG_ACTIVITY_NEW_TASK標簽去啟動了ActivityC,但是因為我們忘了給Activity設置taskAffinity這個小婊砸,所以導致ActivityC的taskAffinity值和ActivityB一樣都是默認的包名。所以我們啟動ActivityC的時候系統將ActivityC壓入了ActivityB所在的task。我們可以使用adb shell dumpsys activity activities 指令看下一在我們重新從A中啟動B之前,Task的情況:

我們可以看到正如我們所想的,ActivityC和ActivityB在一個Task中,由于ActivityA是singleInstance模式,所以A只能做一輩子單身狗了。那么為什么我們明明啟動的是B,怎么會出現C呢?

我們來先看看Google官方文檔對于FLAG_ACTIVITY_NEW_TASK是怎么說的:

注意文檔中的內容,“如果要啟動的 activity 已經運行于某 task 中,則那個 task 將調入前臺,最后保存的狀態也將恢復”,注意這里是所在task被直接調入前臺,也就是說B所在的整個Task將被移入前臺。這就解釋了為什么我們去啟動B而出現的是C了??雌饋砦覀兒孟翊蠊Ω娉闪?,但是,等等,總覺得哪里有點不太對勁,我們的ActivityB明明沒有設置啟動模式啊,你這個是FLAG_ACTIVITY_NEW_TASK標簽,我沒用啊,我讀書多你可別騙我。

仔細想想應該是ActivityA的singleInstance的鍋。

我們再來看看Google官方文檔對于singleInstance是怎么說的吧:

看到最后一句,終于可以結案了。也就是說,當一個被設置為singleInstance的Activity去啟動其他的Activity的時候,其默認是自帶FLAG_ACTIVITY_NEW_TASK標簽的。

1、FLAG_ACTIVITY_NEW_TASK標簽必須配合taskAffinity屬性使用,如果不設置taskAffinity屬性值,將不會生成新task。

2、當從啟動模式為singleInstance的Acitivity中啟動新的Acitivity時,新的Activity自帶FLAG_ACTIVITY_NEW_TASK標簽。

心得:官方文檔是個好東西。

當前題目:android啟動模式,android 四種啟動模式
文章地址:http://www.yijiale78.com/article8/dsiopip.html

成都網站建設公司_創新互聯,為您提供Google、商城網站、App開發、建站公司云服務器域名注冊

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

手機網站建設