那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Android Activity啟動模式的詳解

Dbwd_Imgtec ? 來源:未知 ? 作者:李倩 ? 2018-04-18 15:47 ? 次閱讀

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去啟動目標,容易出現你意想不到的結果。

例如:(大概意思,startActivityForResult相當于白設置,會返回一個取消的結果)

2、當Activity執行了onDestroy,沒有執行finish,那么實例都還是存在棧里的。但Activity被finish掉了,則它會是新建實例重新入棧,不會按啟動模式想的那樣。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3945

    瀏覽量

    127946

原文標題:詳解Android Activity啟動模式

文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    #硬聲創作季 Android應用開發:Activity啟動模式

    AndroidAct
    Mr_haohao
    發布于 :2022年11月02日 22:50:14

    Android系統與應用開發內容介紹

    并在設備上運行本實驗通過IDE中啟動模擬器并通過模擬器進行斷點調試,并對項目的整體架構有簡單的了解。 第二階段 11.Android應用剖析(上)12.Activity 1)Activity
    發表于 07-13 14:03

    Android系統與應用開發培訓班

    運用Android的安全模式。 要求 本課程面向希望把握3G歷史性機遇,成為3G移動互聯網緊缺人才,并擁有一年以上軟件開發經驗或計算機相關專業碩士學歷(包括在讀),同時具備Java語言基礎的開發者
    發表于 03-23 14:12

    [資料分享]+Android從入門到精通

    1.2 Android簡介1.2.1 Andriod的歷史1.2.2 Andriod的未來1.2.3 Andriod平臺的技術架構1.3 Android應用程序構成1.3.1 活動(Activity)1.3.2 意圖
    發表于 09-26 09:53

    Android的Intent該怎么使用?

    Intent 是 Android 應用程序組件之間啟動,通信的一個對象。舉個例子,Android 中的頁面 Activity 之間互相跳轉,就需要通過 Intent 對象來完成。不止
    發表于 09-12 09:05

    迅為i.MX6Q開發板Android啟動APP

    本文檔將講解迅為i.MX6Q開發板如何讓 APP 在系統運行時自啟動,我們先新建一個工程名為 autorun 的空工程,或者大家可以自行選擇想要啟動的 App 工程。我們要讓 app 在開機之后自動
    發表于 04-08 14:33

    第13章Activity、Intent和Service系統結

    13.1 Java語言編程基礎 13.2 Android應用程序組件 13.3 Activity 13.4 Intent 13.5 Service 13.6 對話框 13.7 Android 程序命周期
    發表于 04-11 14:44 ?0次下載

    Android開發手冊—API函數詳解

    Android開發手冊—API函數詳解
    發表于 10-17 09:01 ?13次下載
    <b class='flag-5'>Android</b>開發手冊—API函數<b class='flag-5'>詳解</b>

    基于Android開發手冊—API函數詳解

    基于Android開發手冊—API函數詳解
    發表于 10-24 09:06 ?18次下載
    基于<b class='flag-5'>Android</b>開發手冊—API函數<b class='flag-5'>詳解</b>

    如何進行Android中Task任務棧的分配

    只是針對Activity而言的。 Activity有不同的啟動模式, 可以影響到task的分配 Task,簡單的說,就是一組以棧的模式聚集在
    發表于 07-03 17:42 ?0次下載
    如何進行<b class='flag-5'>Android</b>中Task任務棧的分配

    androidActivity應用

    androidActivity應用(電力電子電源技術及應用課后答案)-androidActivity應用,有需要的可以參考!
    發表于 08-31 13:22 ?1次下載
    <b class='flag-5'>android</b>的<b class='flag-5'>Activity</b>應用

    android-Activity

    android-Activity(深圳普德新星電源技術有限公司怎樣)-android-Activity,有需要的可以參考!
    發表于 08-31 15:51 ?1次下載
    <b class='flag-5'>android-Activity</b>

    Android開發—使用ActivityGroup來切換Activity和Layout

    Android開發—使用ActivityGroup來切換Activity和Layout(ups電源技術參數)-該文檔為Android開發—使用ActivityGroup來切換Activity
    發表于 09-27 15:36 ?3次下載
    <b class='flag-5'>Android</b>開發—使用ActivityGroup來切換<b class='flag-5'>Activity</b>和Layout

    Activity初學乍練

    本節開始講解Android的四大組件之一的Activity(活動),先來看下官方對于Activity的介紹:PS:官網文檔:Activity
    的頭像 發表于 04-01 22:28 ?1465次閱讀
     <b class='flag-5'>Activity</b>初學乍練

    帶大家探究Activity啟動前的一項重要的工作—棧校驗

    本文從一例業務中遇到的問題出發,以FLAG_ACTIVITY_NEW_TASK這一flag作為切入點,帶大家探究Activity啟動前的一項重要的工作——棧校驗。
    的頭像 發表于 04-19 09:36 ?691次閱讀
    百家乐桌子租| 1月24进房子风水好吗| 娱乐城网站| 百家乐庄闲筹码| 视频百家乐官网信誉| 大发888促销代码| 澳门百家乐赢钱秘诀| 上海玩百家乐官网算不算违法| 大发888手机版亚洲城| 澳门百家乐大揭密| 新锦江百家乐官网娱乐网| 在线赌博网站| 龙博百家乐的玩法技巧和规则| 网上玩百家乐官网的玩法技巧和规则 | 大发888信用好不好| 长城百家乐游戏| 网上赌百家乐官网可信吗| 蜀都棋牌游戏大厅| 百家乐玩牌| 视频百家乐官网平台| 百家乐官网视频游戏账号| 大发888娱乐场大发888娱乐场| 网上百家乐赌博犯法吗| 百家乐官网网上真钱娱乐平台| 皇冠网小说网站网址| 威尼斯人娱乐城真人游戏| 噢门百家乐注码技巧| 网上百家乐官网赌场娱乐网规则 | 百家乐官网桌布专业| 网络赌博| 风水24山组成| 视频百家乐官网网站| 新丰县| 顶级赌场真假的微博| 百家乐娱乐平台开户| 百家乐赌王有哪些| 百家乐官网打立了| 游戏百家乐官网押发| 澳门博彩网站| 线上百家乐手机版| 百家乐赌博游戏平台|