Android flag詳解
Android flag詳解
一.Flag標志位
在閱讀源碼的時候經常發現有一些標志屬性使用一些位操作來判斷是否具有該標志,增加標志或者去除標志。
如:
二.addFlags?(int?flags)和setFlags?(int?flags)區別
Public?Intent?addFlags?(int?flags)
增加額外的標志到Intent(或者已經存在的flags值)
參數?flags?需要設置的新的flags
Returns(返回值)
返回相同Intent對象,用來將多個調用鏈接成一個調用的聲明
public?Intent?setFlags?(int?flags)
設置特定的flags去控制Intent如何執行。大部分的values?依賴于正在被執行的Intent組件的類型,特別是FLAG_ACTIVITY_*?這些flags全部用在Context.startActivity()?和
FLAG_RECEIVER_*?這些flags全部用在?Context.sendBroadcast().
具體內容詳情看task和back?stack
參數?flags?設置要求的flags
Returns(返回值)
返回相同Intent對象,用來將多個調用鏈接成一個調用的聲明
三.相關知識的理解
Task
Task就是一個任務棧,里面用來存放Activity,第一個進去的(Activity)處于棧的最下面,而最后創建的(Activity)則處于棧的最上面。從Task中取出(Activity)是從最頂端取出,也就是說先進后出,后進先出。而Activity在Task中的順序是可以控制的,在Activity跳轉時用到Intent Flag可以設置新建Activity的創建方式。
Back?Stack
字面意思,是回退棧的意思,它屬于數據結構中棧的一種。當從一個Activity?跳到另一個Activity的時候,如果不進行特殊的處理,就會有Activity被壓入棧。當回退棧為空的時候,表示當前,已經到達了Lancher。因此,我們就可以知道BackStack就是一個存儲Activity的容器,一般情況下,每需要執行一個Task,都至少有一個回退棧,這個容器中也至少有一個Activity實例。
LanchMode的作用和使用方法
點擊以下文章:安卓啟動Launch mode
例子:
在已經啟動A,B,C,D四個Activity的情況下。再啟動C的時候,不希望是ABCDC,而是AB,而且B上的數據需要保留
Intent it = new Intent(D.this,B.class);
it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//設置可以關掉它所跳到的界面之外已經開啟的activity在這里是把C關閉
it.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//設置不要刷新即將跳轉的頁面
D.this.startActivity(it);
四.各Flag(標志)屬性?詳解
FLAG_GRANT_READ_URI_PERMISSION
如果設置了,Intent的接受者將被準許執行read操作(Intent?攜帶的URI數據和任何Clipdata中特定的URIs數據)的權限。
FLAG_GRANT_WRITE_URI_PERMISSION
如果設置了,Intent的接受者將被準許執行write操作(Intent?攜帶的URI數據和任何Clipdata中特定的URIs數據)的權限。
FLAG_GRANT_PERSISTABLE_URI_PERMISSION
當結合使用?flag_grant_read_uri_permission?和/或?flag_grant_write_uri_permission,URI權限授予可以堅持在設備重新啟動直到明確撤銷?用revokeuripermission(URI,int)。
FLAG_GRANT_PREFIX_URI_PERMISSION
當結合使用?flag_grant_read_uri_permission?和/或?flag_grant_write_uri_permission,URI權限授予適用于任何前綴匹配不同于原始的授予的URI。
FLAG_DEBUG_LOG_RESOLUTION
使能夠使用調試功能的flag。設置之后,日志信息將在intent處理過程被輸出,為了告訴你最后的解決列表被發現已創建。
FLAG_FROM_BACKGROUND
可以由調用者設置,以指示此意圖來自后臺操作,而不是來自直接用戶交互.。
FLAG_ACTIVITY_BROUGHT_TO_FRONT
這個flag不能正常地被應用程序代碼設置,而是系統為你設置由于在?launchMode?設置為singleTask模式
FLAG_ACTIVITY_CLEAR_TOP
如果已設置,并且正在啟動的活動已經在當前任務(backstack)中運行,那么,而不是啟動該活動的新實例,而且它上面的所有其他活動都將被關閉,而這個意圖將作為一個新的意圖傳遞到(現在的頂部)舊活動中.。
FLAG_ACTIVITY_NEW_TASK
設置此標志使activity將成為此歷史堆棧上新任務的開始
1.如果D這個Activity在Manifest.xml中的聲明中添加了Task Affinity,系統首先會查找有沒有和D的Task Affinity相同的Task棧存在,如果有存在,將D壓入那個棧
2.如果D這個Activity在Manifest.xml中的Task Affinity默認沒有設置,則會把其壓入棧1,變成:A B C D,這樣就和標準模式效果是一樣的了。
禁用掉系統默認的Activity切換動畫。
FLAG_ACTIVITY_NO_HISTORY
設置此標志activity將不添加到回退棧(backStack)
FLAG_ACTIVITY_NO_USER_ACTION
設置此標志,將阻止onuserleavehint()正常回調發生在當前最前的活動,在它被停下來作為新啟動活動被帶到前面。
FLAG_ACTIVITY_PREVIOUS_IS_TOP
如果設置并使用此意圖從現有的一個activity?a啟動到新activity?b,新avitivity?b將不會被視為棧頂而是activity?a,而是決定是否新意圖傳遞到頂部而不是啟動新的活動。
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
設置此標志使這個活動要么開始在一個新的任務或帶到現有的任務的頂部,那么它將被啟動作為任務的前門。
FLAG_ACTIVITY_REORDER_TO_FRONT
如果在通過?Context.startactivity()去設置/啟動一個Intent,如果需要啟動的activity已經運行,此標志使被啟動的活動被帶到任務的歷史堆棧的前面.。
FLAG_ACTIVITY_SINGLE_TOP
如果設置,activity將不會被啟動如果其正在backstack的棧頂
FLAG_ACTIVITY_TASK_ON_HOME
如果在通過?Context.startactivity()去設置/啟動一個Intent,此flag將使新啟動任務置于當前活動任務的頂部(如果只有一個task時)。
FLAG_RECEIVER_REGISTERED_ONLY
如果設置,當發送一個廣播只有注冊接收器將被調用,沒有BroadcastReceiver組件將被啟動。
FLAG_RECEIVER_FOREGROUND
當發送廣播的時候設置了這個標志,會允許接收者以前臺的優先級運行,有更短的時間間隔。正常廣播的接受者是后臺優先級,不會被自動提升。
FLAG_RECEIVER_REPLACE_PENDING
如果在發送廣播時設置了這個標志,那新的廣播會替換掉那些已存在的相同廣播。相同的定義是通過Intent.filterEquals方法對兩個廣播的Intent處理返回true。 當匹配到相同的,新的廣播和對應的接收器會將待發送的廣播列表中已存在的替換掉,在列表中保留同樣的位置。這個標志通常被粘性廣播(Sticky Broadcast)使用,只保證將最新的廣播的值傳遞給接收器。
Android flag詳解相關教程