Activity Intent相關FLAG介紹

先首先簡單介紹下Task和Activity的關系

?

Task就像一個容器,而Activity就相當與填充這個容器的東西,第一個東西(Activity)則會處于最下面,最后添加的東西(Activity)則會在最上面。從Task中取出東西(Activity)是從最頂端取出,也就是說最先取出的是最后添加的東西(Activity),以此類推,最后取出的是第一次添加的Activity,而Activity在Task中的順序是可以控制的,在Activity跳轉時用到Intent Flag可以設置新建activity的創建方式;

??

Intent.FLAG_ACTIVITY_NEW_TASK

?

默認的跳轉類型,它會重新創建一個新的Activity,不過與這種情況,比如說Task1中有A,B,C三個Activity,此時在C中啟動D的話,如果在AndroidManifest.xml文件中給D添加了Affinity的值和Task中的不一樣的話,則會在新標記的Affinity所存在的Task中壓入這個Activity。如果是默認的或者指定的Affinity和Task一樣的話,就和標準模式一樣了啟動一個新的Activity.

?

FLAG_ACTIVITY_SINGLE_TOP

?

這個FLAG就相當于加載模式中的singletop,比如說原來棧中情況是A,B,C,D在D中啟動D,棧中的情況還是A,B,C,D

?

FLAG_ACTIVITY_CLEAR_TOP

?

這個FLAG就相當于加載模式中的SingleTask,這種FLAG啟動的Activity會把要啟動的Activity之上的Activity全部彈出棧空間。類如:原來棧中的情況是A,B,C,D這個時候從D中跳轉到B,這個時候棧中的情況就是A,B了

?

FLAG_ACTIVITY_BROUGHT_TO_FRONT

?

這個網上很多人是這樣寫的。如果activity在task存在,拿到最頂端,不會啟動新的Activity。這個有可能會誤導大家! 他這個FLAG其實是這個意思!比如說我現在有A,在A中啟動B,此時在A中Intent中加上這個標記。此時B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式啟動,此時在B中再啟動C,D(正常啟動C,D),如果這個時候在D中再啟動B,這個時候最后的棧的情況是 A,C,D,B。如果在A,B,C,D正常啟動的話,不管B有沒有用FLAG_ACTIVITY_BROUGHT_TO_FRONT啟動,此時在D中啟動B的話,還是會變成A,C,D,B的。

?

FLAG_ACTIVITY_NO_USER_ACTION

?

onUserLeaveHint()作為activity周期的一部分,它在activity因為用戶要跳轉到別的activity而要退到background時使用。比如,在用戶按下Home鍵,它將被調用。比如有電話進來(不屬于用戶的選擇),它就不會被調用。

那么系統如何區分讓當前activity退到background時使用是用戶的選擇?

?

它是根據促使當前activity退到background的那個新啟動的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的。

?

注意:調用finish()使該activity銷毀時不會調用該函數

?

FLAG_ACTIVITY_NO_HISTORY

?

意思就是說用這個FLAG啟動的Activity,一旦退出,它不會存在于棧中,比方說!原來是A,B,C這個時候再C中以這個FLAG啟動D的,D再啟動E,這個時候棧中情況為A,B,C,E。

?

**********************************************************************

?

Activity有四種加載模式:standard(默認), singleTop, singleTask和 singleInstance。以下逐一舉例說明他們的區別:

standard:Activity的默認加載方法,即使某個Activity在 Task棧中已經存在,另一個activity通過Intent跳轉到該activity,同樣會新創建一個實例壓入棧中。例如:現在棧的情況為:A B C D,在D這個Activity中通過Intent跳轉到D,那么現在的棧情況為: A B C D D 。此時如果棧頂的D通過Intent跳轉到B,則棧情況為:A B C D D B。此時如果依次按返回鍵,D??D C B A將會依次彈出棧而顯示在界面上。

singleTop:如果某個Activity的Launch mode設置成singleTop,那么當該Activity位于棧頂的時候,再通過Intent跳轉到本身這個Activity,則將不會創建一個新的實例壓入棧中。例如:現在棧的情況為:A B C D。D的Launch mode設置成了singleTop,那么在D中啟動Intent跳轉到D,那么將不會新創建一個D的實例壓入棧中,此時棧的情況依然為:A B C D。但是如果此時B的模式也是singleTop,D跳轉到B,那么則會新建一個B的實例壓入棧中,因為此時B不是位于棧頂,此時棧的情況就變成了:A B C D B。

singleTask:如果某個Activity是singleTask模式,那么Task棧中將會只有一個該Activity的實例。例如:現在棧的情況為:A B C D。B的Launch mode為singleTask,此時D通過Intent跳轉到B,則棧的情況變成了:A B。而C和D被彈出銷毀了,也就是說位于B之上的實例都被銷毀了。

singleInstance:將Activity壓入一個新建的任務棧中。例如:Task棧1的情況為:A B C。C通過Intent跳轉到D,而D的Launch mode為singleInstance,則將會新建一個Task棧2。此時Task棧1的情況還是為:A B C。Task棧2的情況為:D。此時屏幕界面顯示D的內容,如果這時D又通過Intent跳轉到D,則Task棧2中也不會新建一個D的實例,所以兩個棧的情況也不會變化。而如果D跳轉到C,則棧1的情況變成了:A B C C,因為C的Launch mode為standard,此時如果再按返回鍵,則棧1變成:A B C。也就是說現在界面還顯示C的內容,不是D。
好了,現在有一個問題就是這時這種情況下如果用戶點擊了Home鍵,則再也回不到D的即時界面了。如果想解決這個問題,可以為D在Manifest.xml文件中的聲明加上
?????????????????????????????????????????????????
?????????????????????????????????????????????????
??????????????????????????????????????????????

加上這段之后,也就是說該程序中有兩個這種聲明,另一個就是那個正常的根 activity,在打成apk包安裝之后,在程序列表中能看到兩個圖標,但是如果都運行的話,在任務管理器中其實也只有一個。上面的情況點擊D的那個圖標就能回到它的即時界面(比如一個EditText,以前輸入的內容,現在回到之后依然存在)。

/

Intent的常用Flag參數:

FLAG_ACTIVITY_CLEAR_TOP:例如現在的棧情況為:A B C D 。D此時通過intent跳轉到B,如果這個intent添加FLAG_ACTIVITY_CLEAR_TOP 標記,則棧情況變為:A B。如果沒有添加這個標記,則棧情況將會變成:A B C D B。也就是說,如果添加了FLAG_ACTIVITY_CLEAR_TOP 標記,并且目標Activity在棧中已經存在,則將會把位于該目標activity之上的activity從棧中彈出銷毀。這跟上面把B的Launch mode設置成singleTask類似。

FLAG_ACTIVITY_NEW_TASK:例如現在棧1的情況是:A B C。C通過intent跳轉到D,并且這個intent添加了FLAG_ACTIVITY_NEW_TASK 標記,如果D這個Activity在Manifest.xml中的聲明中添加了Task affinity,并且和棧1的affinity不同,系統首先會查找有沒有和D的Task affinity相同的task棧存在,如果有存在,將D壓入那個棧,如果不存在則會新建一個D的affinity的棧將其壓入。如果D的Task affinity默認沒有設置,或者和棧1的affinity相同,則會把其壓入棧1,變成:A B C D,這樣就和不加FLAG_ACTIVITY_NEW_TASK 標記效果是一樣的了。??????注意如果試圖從非activity的非正常途徑啟動一個activity,比如從一個service中啟動一個activity,則intent比如要添加FLAG_ACTIVITY_NEW_TASK 標記。

FLAG_ACTIVITY_NO_HISTORY:例如現在棧情況為:A B C。C通過intent跳轉到D,這個intent添加FLAG_ACTIVITY_NO_HISTORY標志,則此時界面顯示D的內容,但是它并不會壓入棧中。如果按返回鍵,返回到C,棧的情況還是:A B C。如果此時D中又跳轉到E,棧的情況變為:A B C E,此時按返回鍵會回到C,因為D根本就沒有被壓入棧中。

?FLAG_ACTIVITY_SINGLE_TOP:和上面Activity的 Launch mode的singleTop類似。如果某個intent添加了這個標志,并且這個intent的目標activity就是棧頂的activity,那么將不會新建一個實例壓入棧中。

?/

Activity的主要屬性:

allowTaskReparenting:設置成true時,和Intent的FLAG_ACTIVITY_NEW_TASK 標記類似。

alwaysRetainTaskStat:???如果用戶長時間將某個task 移入后臺,則系統會將該task的棧內容彈出只剩下棧底的activity,此時用戶再返回,則只能看到根activity了。如果棧底的 activity的這個屬性設置成true,則將阻止這一行為,從而保留所有的棧內容。

clearTaskOnLaunch:根activity的這個屬性設置成true時,和上面的alwaysRetainTaskStat 的屬性為true情況搞好相反。

finishOnTaskLaunch:對于任何activity,如果它的這個屬性設置成true,則當task被放置到后臺,然后重新啟動后,該activity將不存在了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

js的原型和原型鏈

構造函數創建對象: function Person() {} var person new Person(); person.name Kevin; console.log(person.name) // KevinPerson 就是一個構造函數,我們使用 new 創建了一個實例對象 person prototype 每個函數都有一個 prototype 屬性 每一個Ja…

二維數組

要求:求一個二維數組的最大子數組和 思路:對于這個題,我會最簡單的讀取,雖然在網上查到了代碼,但是查找最大子數組的循環我真的看不懂,也不是特別懂思路,所以在這不會寫思路 package 二維數組; …

資源

資源鏈接: 內存池TinySTLminiSTLcghSTL1. lishuhuakai 2. 轉載于:https://www.cnblogs.com/sunbines/p/9707483.html

Android判斷應用或Activity是否存在

一、根據包名判斷應用是否存在public boolean checkApplication(String packageName) { if (packageName null || "".equals(packageName)){ return false; } try { ApplicationInfo info getPackageManager().getApplicationInfo(packageName, PackageManager.GET…

vue ref

https://www.jianshu.com/p/623c8b009a85

033 Url中特殊字符的處理

在url跳轉頁面的時候,參數值中的#不見了,一直沒有處理,今天有空看了一下,后來發現后臺的過濾器之類的都沒有處理,就比較奇怪了,原來是特殊字符的問題。 一:Url中的特殊字符 1.說明 這里還是需要…

Effective Java(1)-創建和銷毀對象

Effective Java(1)-創建和銷毀對象 轉載于:https://www.cnblogs.com/Johar/p/10556218.html

什么是Affinity

什么是Affinity 在某些情況下,Android需要知道一個Activity屬于哪個Task,即使它沒有被啟動到一個具體的Task里。這是通過任務共用性(Affinities)完成的。任務共用性(Affinities)為這個運行一個或多…

vue this

https://blog.csdn.net/cddcj/article/details/80866902

課外書——自控力(斯坦福大學最受歡迎的心理學課程)

01我要做,我不要,我想要:什么是意志力?為什么意志力?為什么意志力至關重要? 核心思想: 意志力實際上是“我要做”、“我不要”和“我想要”這三種力量。它們協同努力,讓我們變成更好…

Docker運行GUI軟件的方法

轉自 https://www.csdn.net/article/2015-07-30/2825340 簡介: Docker通過namespace將容器與主機上的網絡和運行環境進行了隔離,默認情況下,在容器中運行帶界面的軟件在外部是看不到的。在這個分享中,將介紹通過共享X11套接字讓外…

JS正則表達式驗證數字非常全

驗證數字的正則表達式集 驗證數字:^[0-9]*$ 驗證n位的數字:^\d{n}$ 驗證至少n位數字:^\d{n,}$ 驗證m-n位的數字:^\d{m,n}$ 驗證零和非零開頭的數字:^(0|[1-9][0-9]*)$ 驗證有兩位小數的正實數:^[0-9](.[0-9…

VMware VIC

vSphere Integrated Containers - a short intro High-Level view of VCH Networking vSphere Integrated Containers Roles and Personas 參考鏈接:https://vmware.github.io/vic-product/assets/files/html/1.4/轉載于:https://www.cnblogs.com/vincenshen/p/9715…

vue new vue

https://www.jianshu.com/p/5ca5f40e4810

MySQL 之group_concat_max_length Mac 版

用過MySQL的人都知道,group_concat這個函數是有最大值限制的,當超過了最大值就會報錯! 在window下的處理方法就是修改MySQL的配置文件my.ini,在其中添加 #group_concat_max_len setting group_concat_max_len 1024000000 然…

Locust學習總結分享

簡介: Locust是一個用于可擴展的,分布式的,性能測試的,開源的,用Python編寫框架/工具,它非常容易使用,也非常好學。它的主要思想就是模擬一群用戶將訪問你的網站。每個用戶的行為由你編寫的py…

IDEA系列(四)一部署war 和 war exploded的區別

war模式:將WEB工程以包的形式上傳到服務器 ; war exploded模式:將WEB工程以當前文件夾的位置關系上傳到服務器;(1)war模式這種可以稱之為是發布模式,看名字也知道,這是先打成war包&a…

Vue常用7個屬性

https://www.cnblogs.com/bgwhite/p/9297221.html

初始Zookeeper

Zookeeper是一個分布式服務框架,據說是一個比較強大的架構模式,具體我也不甚了解,但是最近由于工作上的原因,需要部署一個Zookeeper服務,實現移動端一個簡單的發單、搶單功能。于是我便開始了解這個框架,將…

開發進度

項目名稱:信息技術手冊查重錯誤比對分析 功能概述: (1) 數據導入:要求將提供的信息技術手冊文檔倒入數據庫中 方法: 將word文檔中的內容復制到text中,利用notepad打開,利用正則表達…