網(wǎng)站首頁 編程語言 正文
1.XML配置的幾種方式詳解
首先,我們知道,android有任務棧機制,啟動任務棧的方式有xml中配置,還有就是通過intent設置flag去啟動相應的activity。這里我們分三部分來介紹 1.xml配置的幾種方式詳解 2.intent flag啟動的幾種方式詳解 3.flag 與 xml 幾種方式的區(qū)別和聯(lián)系
Android開發(fā)者在AndroidMainifest文件中一共設計了四種啟動模式,如下所示
1.1 standard
默認的啟動模式,如果不指定Activity的啟動模式,則使用這種方式啟動Activity。這種啟動模式每次都會創(chuàng)建新的實例,每次點擊standard模式創(chuàng)建Activity后,都會創(chuàng)建新的MainActivity覆蓋在原Activity上。 實際代碼驗證 我們實例代碼驗證一下,新建三個activity,xml中不配置任務棧方式(默認為標準棧),三個activity相互跳轉,代碼如下:
package com.itbird.task; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import com.itbird.R; import com.itbird.bitmapOOM.BitmapUtils; import com.itbird.viewEvent.MyView; public class MainTestActivity extends AppCompatActivity { private static final String TAG = MainTestActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.task_test); Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class); startActivity(intent); } }); } @Override protected void onNewIntent(Intent intent) { Log.e(TAG, TAG + " onNewIntent"); super.onNewIntent(intent); } @Override protected void onDestroy() { Log.e(TAG, TAG + " onDestroy"); super.onDestroy(); } }
運行之后,跳轉順序為1-2-3-1,通過adb命令查看后臺任務棧信息adb shell dumpsys activity activities | grep com.itbird
我們看到后臺任務棧,的確是保持為同一個,而且activity實例一直是新建累加的。
1.2 singleTop
如果指定啟動Activity為singleTop模式,那么在啟動時,系統(tǒng)會判斷當前棧頂Activity是不是要啟動的Activity,如果是則不創(chuàng)建新的的Activity而直接引用這個Activity;如果不是則創(chuàng)建新的Activity。 實際代碼驗證 我們在第一個樣例的基礎代碼上,把第三個activity任務棧模式改為singleTop,相同的跳轉邏輯,1-2-3-3,運行查看一下任務棧信息
1.3 singleTask
singliTask模式與singleTop模式類似,只不過singleTop是堅持棧頂元素是否是需要啟動的Activity,而singleTask是檢測整個Activity棧中是否存在需要啟動的Activity。如果存在,則將該Activity置于棧頂,并將該Activity以上的Activity都銷毀。不過這里是指在同一個App中啟動這個singleTask的Activity,如果是其他程序以singleTask模式來啟動這個Activity,那么它將創(chuàng)建一個新的任務棧。不過這里有一點需要注意的是,如果啟動的模式為singleTask的Activity已經(jīng)在后臺一個任務棧中了,那么啟動后,后臺的這個任務棧將一起被切換到前臺。 實際代碼驗證 我們在第一個樣例的基礎代碼上,把第一個activity任務棧模式改為singleTask,相同的跳轉邏輯,1-2-3-1,運行查看一下任務棧信息
1.4 singleInstance
singleInstance這種模式和使用閱覽器工資類似。在多個系統(tǒng)訪問閱覽器時,如果當前閱覽器沒有打開,則打開閱覽器,否則會在當前打開的閱覽器中訪問。申明為singleInstance的Activity會出現(xiàn)在一個新的任務棧中,而且這個任務棧只會存在一個Activity。 實際代碼驗證 我們在第一個樣例的基礎代碼上,把第三個activity任務棧模式改為singleInstance,相同的跳轉邏輯,1-2-3-3,運行查看一下任務棧信息
2.Intent flag啟動的幾種方式詳解
2.1 單獨使用
- FLAG_ACTIVITY_NEW_TASK 加上 FLAG_ACTIVITY_NEW_TASK flag 后,啟動一個 Activity 時,如果需要創(chuàng)建,被啟動的 Activity 會在它需要的棧中創(chuàng)建。如 A 啟動 B,B 會在 B 自己需要的棧中被創(chuàng)建(即 taskAffinity 指定的棧)。
我們還是以之前的三個界面的例子,三個界面的xml配置啟動棧方式都為標準棧,跳轉順序為1-2-3-1,跳轉過程中使用FLAG_ACTIVITY_NEW_TASK flag,代碼:
Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
可以看到,在一個任務棧中,即使重新啟動1,也是新建實例1,也就是說,這個Flag只是去找尋親和屬性的棧或者新建棧,并不對棧內的實例進行復用、清空等操作。這里看出來了吧,F(xiàn)LAG_ACTIVITY_NEW_TASK != singleTask哦,網(wǎng)上有很多誤人子弟的文章,大家還是自己實踐出真知吧
- FLAG_ACTIVITY_CLEAR_TOP 我們還是以之前的三個界面的例子,三個界面的xml配置啟動棧方式都為標準棧,跳轉順序為1-2-3-1,跳轉過程中使用FLAG_ACTIVITY_CLEAR_TOP flag,代碼:
Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
這時肯定有小伙伴問了,這不就和singleTask一樣的效果了嗎?我很確定的告訴您,不是哦~~~,clear_top如果檢測到棧中有實例存在,會清空棧內包含本身的以上所有activity,我們看一下activity 1的log日志打印就知道了
所以,這里我們知道一個關鍵點:這里看出來了吧,F(xiàn)LAG_ACTIVITY_CLEAR_TOP != singleTask哦,網(wǎng)上有很多誤人子弟的文章,大家還是自己實踐出真知吧
- FLAG_ACTIVITY_SINGLE_TOP 我們還是以之前的三個界面的例子,三個界面的xml配置啟動棧方式都為標準棧,跳轉順序為1-2-3-3,跳轉過程中使用FLAG_ACTIVITY_SINGLE_TOP flag,代碼:
Intent intent = new Intent(MainTestActivity.this, SecondTestActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent);
從這里可以看出,F(xiàn)LAG_ACTIVITY_SINGLE_TOP == singleTop哦
2.2 組合使用
針對于組合使用,我們直接說結論吧,依然是上面的例子,很好驗證
- FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP activity 在前臺(當前顯示的棧的棧頂),不創(chuàng)建,它自己 onNewIntent 被調用;activity 不在前臺的情形下,activity 需要的棧存在,在該棧中創(chuàng)建一個 activity 或將該棧移至前臺(它自己 onNewIntent 被調用),activity 需要的棧不存在,創(chuàng)建一個它需要的棧,再創(chuàng)建 activity
- FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP activity 在它需要的棧里存在,它上面的 activity 會出棧,它自己 finish 后重建 activity 在它需要的棧里不存在,在它需要的棧里創(chuàng)建 所以此處備注:
FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP != singleTask
- FLAG_ACTIVITY_CLEAR_TOP + FLAG_ACTIVITY_SINGLE_TOP activity 在前臺(當前顯示的棧的棧頂),不創(chuàng)建,它自己 onNewIntent 被調用;activity 不在前臺的情形下,activity 在它需要的棧里存在,它上面的 activity 會出棧,它自己 onNewIntent 被調用,activity 在它需要的棧里不存在,在它需要的棧里創(chuàng)建。 所以此處備注:
FLAG_ACTIVITY_SINGLE_TOP + FLAG_ACTIVITY_CLEAR_TOP == singleTask
3.flag 與 xml 幾種方式的區(qū)別和聯(lián)系
其實相關區(qū)別和聯(lián)系在上面已經(jīng)基本都說過了,這里用等式簡單總結一下: FLAG_ACTIVITY_NEW_TASK != singleTask
FLAG_ACTIVITY_CLEAR_TOP != singleTask
FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_CLEAR_TOP != singleTask
FLAG_ACTIVITY_SINGLE_TOP + FLAG_ACTIVITY_CLEAR_TOP == singleTask
FLAG_ACTIVITY_SINGLE_TOP == singleTop
當然這些結論都是基于最初的activity是標準棧的前提,如果將activity最初xml配置改為其他啟動棧模式,結論可能有些就發(fā)生了一點點的改變。 我們不需要死記硬背這些知識,這些知識點最好各位結合自己的實踐Demo驗證一波,同時記住一點,F(xiàn)LAG_ACTIVITY_NEW_TASK 只是針對于棧的描述,F(xiàn)LAG_ACTIVITY_CLEAR_TOP 會銷毀本身,這就行了。
原文鏈接:https://juejin.cn/post/7178268320330678329
相關推薦
- 2022-09-08 pytorch關于Tensor的數(shù)據(jù)類型說明_python
- 2024-03-22 springboot 中 Getmapping獲取參數(shù)的方式
- 2022-07-29 使用React?Router?v6?添加身份驗證的方法_React
- 2022-08-25 .net加載失敗的程序集實現(xiàn)重新加載_實用技巧
- 2022-12-21 iOS開發(fā)學習TableView展現(xiàn)一個list實例_IOS
- 2022-03-23 Asp.Net?Core?使用Monaco?Editor?實現(xiàn)代碼編輯器功能_實用技巧
- 2022-05-10 fatal: Not a git repository (or any of the parent
- 2023-11-23 pyside6兩個按鈕,一個控制子線程的開始,暫停,。一個控制子線程結束
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支