詳解Android Activity---啟動模式

来源:http://www.cnblogs.com/wujiancheng/archive/2017/07/13/7161789.html
-Advertisement-
Play Games

相關的基本概念: 1、任務棧(Task) 若幹個Activity的集合的棧表示一個Task。 棧不僅僅只包含自身程式的Activity,它也可以跨應用包含其他應用的Activity,這樣有利於保障用戶體驗,維護用戶操作體驗上的完整性。例如:微信ActivityA 分享文章到QQActivityB,兩 ...


相關的基本概念:

1、任務棧(Task)

  若幹個Activity的集合的棧表示一個Task。   棧不僅僅只包含自身程式的Activity,它也可以跨應用包含其他應用的Activity,這樣有利於保障用戶體驗,維護用戶操作體驗上的完整性。
例如:微信ActivityA 分享文章到QQActivityB,兩個activity是存在於不同app中的,但是被系統放在一個任務中,分享後,用戶按back鍵返回,可以返回到原來的微信Activity A中,這就確保了用戶體驗。   2、查看當前系統的任務棧
  命令行中 --> adb shell dumpsys activity
  3、Activity 的相關屬性   android:taskAffinity:是否定義了該屬性,對接下來討論到的singleTask影響甚大,如果設置了Activity的taskAffinity屬性值,Activity將在TaskName為指定值的獨立Task中啟動,否則,將在原來的預設Task中。     android:allowTaskReparenting:主要作用是activity的遷移,程式A已經啟動了若幹個Activity,其中包含Activity1(這個Activity1擁有該屬性),當程式B也要啟動它的時候,其可遷移到程式B內。    android:alwaysRetainTaskState:操作系統會在程式長時間不會動的時候,清除Task狀態,如果開啟這個,系統會繼續保持直到再次打開,只對根Activity生效(ABC,A是棧底,C是棧頂,只能對A即可)。例如微信在後臺,當我們再次打開應用時,系統會判斷是否已經存在以A為根Activity的棧,如果有,直接使用該棧,並顯示棧頂的Activity。     android:clearTaskOnLaunch:用來標記是否在啟動該Activity時,清除除根目錄的其他Activity     android:exported:是否支持其它應用調用當前組件。預設值:包含有intent-filter 預設值為true(); 沒有intent-filter預設值為false。   四種啟動模式:     standard:每次激活Activity時(startActivity),都創建Activity實例,並放入任務棧;     singleTop:如果該Activity位於任務棧棧頂,則不需要創建,復用實例並且會調用該實例的onNewIntent()方法將Intent對象傳遞到這個實例中,其餘情況都要創建Activity實例;(singleTop模式,只在當前任務棧中生效、startActivityForResult啟動一個設置了singleTop的activity,singleTop模式將無效)   關於onNewIntent():根據文檔知,當Activity的啟動模式是singleTop或者使用FLAG_ACTIVITY_SINGLE_TOP這個標記啟動新的Activity並且Activity棧頂就是待啟動的Activity的時候,會調用原Activity的這個方法;例子:QActivity為棧頂復用模式,當Qactivity位於棧頂時,再次打開,onResume()  -->onPause() -->onNewIntent() -->onResume() 。當Qactivity不位於棧頂時,onNewIntent-->onRestart-->onStart-->onResume(也就是說只要棧頂不是Qactivity ,都會創建新的實例,是Qactivity則重用不新建)。     singleTask:使用好棧內復用模式對taskAffinity屬性的理解很重要。 存在相同taskAffinity屬性值的Task:不存在實例,則新建Activity實例。如果存在則把當前實例中復用實例, 這個 Activity 啟動並且清除頂部的 Acitivity ,通過標識 CLEAR_TOP。
taskAffinity屬性值不一樣的Task:在這個 Task 中新建這個 Activity 實例。     singleInstance:和singleTask差不多,唯一不同的是singleInstance Activity實例的Task只能存放一個該模式的Activity實例,例如Qactivity載入Wactivity都會被放入其它的Task中,如果存在與Wactivity相同affinity的Task,則在該Task內創建Wactivity。如果不存在,則重新生成新的Task併入棧。   常用Intent Flags:     FLAG_ACTIVITY_NEW_TASK: 如果task中已經有了你要啟動的activity的話,當前task會被帶到前臺(不管這個activity是否在前臺,有可能activity上邊還壓有別的activity)。如果配合FLAG_ACTIVITY_NEW_MULTI_TASK,則無論什麼情況都會創建新的Task,就成了類似 singleInstance 的情況了。如果配合    FLAG_ACTIVITY_CLEAR_TASK,則會先清空該棧,然後向棧中添加目標Activity,棧ID不變。
例如:Flag為FLAG_ACTIVITY_NEW_TASK,Qactivity(棧為LOL)啟動Wactivity(棧為DOTA),接著啟動Eactivity(棧為DOTA),Home回桌面。打開該應用,Qactivity啟動Wactivity,Eactvity會出現在前臺,因為它是整塊棧啟動(裡面順序不變)。

  FLAG_ACTIVITY_SINGLE_TOP: 相當於launchMode中的singleTop。

  FLAG_ACTIVITY_CLEAR_TOP: 與singleTask類似,但有極大區別,它會銷毀目標Activity和它之上的所有Activity,重新創建目標Activity,並沒有執行onNewIntent()。   tips:指定啟動模式時,Flags的優先順序大於launchMode,當兩者都有時,以Intent Flag有效。   註意事項:     1、當目標的啟動模式不為標準模式時,不要使用startActivityForResult去啟動目標,容易出現你意想不到的結果。
  2、當Activity執行了onDestroy,沒有執行finish,那麼實例都還是存在棧里的。但Activity被finish掉了,則它會是新建實例重新入棧,不會按啟動模式想的那樣。   轉載註明來自:http://www.cnblogs.com/wujiancheng/ 關於Activity其他知識點:詳解Android Activity---Activity的生命周期
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 無序列表是html頁面排版經常用到的非常實用的標簽,但是新手在使用無序列表時,經常會在橫向排版上出現問題,筆者在這裡提供了筆者在使用無序列表製作網頁導航欄時的幾種方法與常見問題的解決問題。(以css內部樣式為例) [註:有同學之前問過我怎麼製作一張網頁,但只會html,本文用到均為css。故說明:若 ...
  • 前段時間用微信開發者工具重構一個菜單項目的時候發現iphoneSE顯示不全以及佈局錯亂的問題,找到了一個簡單粗暴的解決方法。 移動設備上的viewport分為layout viewport 、 visual viewport 和 ideal viewport 三類, 其中的ideal viewpor ...
  • ①Math.trunc() Math.trunc()方法用於去除一個數的小數部分,返回整數部分。 參數為非數值時,Math.trunc()方法會先用Number()將其轉換為數值,若無法獲取數值的整數部分,比如字元串或NaN或空值等,會返回NaN. ②Math.sign() Math.sign()方 ...
  • 總體概念 常見的塊級元素有 DIV, FORM, TABLE, P, PRE, H1~H6, DL, OL, UL 等。 常見的內聯元素有 SPAN, A, STRONG, EM, LABEL, INPUT, SELECT, TEXTAREA, IMG, BR 等。 block,inline和inl ...
  • 直接打開html文件,是以file:///方式打開的,這種方式很多時候會遇到跨域的問題,因此我們一般會搭建一個簡易的本地伺服器,來運行測試頁面。 一、構建靜態伺服器 1、使用express模塊 建立個js文件,命名server,內容代碼如下: 文件結構如下: 運行的話只要執行:node server ...
  • 兩種常用的HTTP請求方式:post和get get:從指定的資源進行請求。數據長度有限制(2048個字元)可被緩存、可被保留在瀏覽器歷史記錄中,安全性較差。發送敏感信息如密碼時不適用。 post:向指定的資源提交要被處理的數據。數據長度無限制、不可被緩存,不可保存在瀏覽器歷史記錄中,安全性較高。 ...
  • 內聯元素:只在行內發生作用,設置寬高不起作用,不會影響文字內容,使其換行等。豎直方向和間距也不起作用 display可以強制轉換行內元素和塊狀元素,還可以取消顯示none 塊元素(block element) address - 地址 blockquote - 塊引用 center - 舉中對齊塊 ...
  • 在drawable下新建文件夾bt_shape.xml,如下: 在activity_main.xml下使用: 實現效果如下: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...