成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android源碼進(jìn)階之ActivityRecord、TaskRecord、ActivityStack以及啟動(dòng)模式詳細(xì)分析

移動(dòng)開(kāi)發(fā) Android
activity啟動(dòng)時(shí)候會(huì)說(shuō)到activity棧,任務(wù)棧,activity任務(wù)棧等詞語(yǔ),但是如果細(xì)問(wèn)這些名詞的代表著什么?以什么表現(xiàn)形式出現(xiàn)?

[[420066]]

前言

activity啟動(dòng)時(shí)候會(huì)說(shuō)到activity棧,任務(wù)棧,activity任務(wù)棧等詞語(yǔ),但是如果細(xì)問(wèn)這些名詞的代表著什么?以什么表現(xiàn)形式出現(xiàn)?

一個(gè)ActivityRecord對(duì)應(yīng)一個(gè)Activity,保存了一個(gè)Activity的所有信息;但是一個(gè)Activity可能會(huì)有多個(gè)ActivityRecord,因?yàn)锳ctivity可以被多次啟動(dòng),這個(gè)主要取決于其啟動(dòng)模式;

一個(gè)TaskRecord由一個(gè)或者多個(gè)ActivityRecord組成,這就是我們常說(shuō)的任務(wù)棧,具有后進(jìn)先出的特點(diǎn);

ActivityStack則是用來(lái)管理TaskRecord的,包含了多個(gè)TaskRecord;

今天我們就來(lái)聊聊怎么管理activity以及任務(wù)棧等;

一、任務(wù)棧源碼解析

1、ActivityRecord

ActivityRecord:歷史棧中的一個(gè)條目,代表一個(gè)activity

  1. final class ActivityRecord extends ConfigurationContainer implements AppWindowContainerListener { 
  2.         final ActivityManagerService service; // owner 
  3.         final IApplicationToken.Stub appToken; // window manager token 
  4.         AppWindowContainerController mWindowContainerController; 
  5.         final ActivityInfo info; // all about me 
  6.         final ApplicationInfo appInfo; // information about activity's app 
  7.         //省略其他成員變量 
  8.         //ActivityRecord所在的TaskRecord 
  9.         private TaskRecord task;        // the task this is in
  10.         //構(gòu)造方法,需要傳遞大量信息 
  11.         ActivityRecord(ActivityManagerService _service, ProcessRecord _caller, int _launchedFromPid, 
  12.                        int _launchedFromUid, String _launchedFromPackage, Intent _intent, String _resolvedType, 
  13.                        ActivityInfo aInfo, Configuration _configuration, 
  14.                        com.android.server.am.ActivityRecord _resultTo, String _resultWho, int _reqCode, 
  15.                        boolean _componentSpecified, boolean _rootVoiceInteraction, 
  16.                        ActivityStackSupervisor supervisor, ActivityOptions options, 
  17.                        com.android.server.am.ActivityRecord sourceRecord) { 
  18.         } 
  19.     } 
  • 實(shí)際上,ActivityRecord中存在著大量的成員變量,包含了一個(gè)Activity的所有信息;
  • ActivityRecord中的成員變量task表示其所在的TaskRecord,由此可以看出:ActivityRecord與TaskRecord建立了聯(lián)系;

startActivity()時(shí)會(huì)創(chuàng)建一個(gè)ActivityRecord

  1. class ActivityStarter { 
  2.         private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent, 
  3.                                   String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo, 
  4.                                   IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 
  5.                                   IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, 
  6.                                   String callingPackage, int realCallingPid, int realCallingUid, int startFlags, 
  7.                                   ActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, 
  8.                                   com.android.server.am.ActivityRecord[] outActivity, TaskRecord inTask) { 
  9.             //其他代碼略 
  10.             ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid, 
  11.                     callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(), 
  12.                     resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null
  13.                     mSupervisor, options, sourceRecord); 
  14.             //其他代碼略 
  15.         } 
  16.     } 

2、TaskRecord

TaskRecord,內(nèi)部維護(hù)一個(gè)ArrayList用來(lái)保存ActivityRecord;

  1. final class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener { 
  2.         final int taskId;       //任務(wù)ID 
  3.         final ArrayList<ActivityRecord> mActivities;   //使用一個(gè)ArrayList來(lái)保存所有的ActivityRecord 
  4.         private ActivityStack mStack;   //TaskRecord所在的ActivityStack 
  5.         //構(gòu)造方法 
  6.         TaskRecord(ActivityManagerService service, int _taskId, ActivityInfo info, Intent _intent, 
  7.                    IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor, int type) { 
  8.         } 
  9.         //添加Activity到頂部 
  10.         void addActivityToTop(com.android.server.am.ActivityRecord r) { 
  11.             addActivityAtIndex(mActivities.size(), r); 
  12.         } 
  13.         //添加Activity到指定的索引位置 
  14.         void addActivityAtIndex(int index, ActivityRecord r) { 
  15.             //... 
  16.             r.setTask(this);//為ActivityRecord設(shè)置TaskRecord,就是這里建立的聯(lián)系 
  17.             //... 
  18.             index = Math.min(sizeindex); 
  19.             mActivities.add(index, r);//添加到mActivities 
  20.             //... 
  21.         } 
  22.         //其他代碼略 
  23.     } 
  • 可以看到TaskRecord中使用了一個(gè)ArrayList來(lái)保存所有的ActivityRecord;
  • 同樣,TaskRecord中的mStack表示其所在的ActivityStack;

startActivity()時(shí)也會(huì)創(chuàng)建一個(gè)TaskRecord;

  1. class ActivityStarter { 
  2.         private int setTaskFromReuseOrCreateNewTask(TaskRecord taskToAffiliate, int preferredLaunchStackId, ActivityStack topStack) { 
  3.             mTargetStack = computeStackFocus(mStartActivity, true, mLaunchBounds, mLaunchFlags, mOptions); 
  4.             if (mReuseTask == null) { 
  5.                 //創(chuàng)建一個(gè)createTaskRecord,實(shí)際上是調(diào)用ActivityStack里面的createTaskRecord()方法,ActivityStack下面會(huì)講到 
  6.                 final TaskRecord task = mTargetStack.createTaskRecord( 
  7.                         mSupervisor.getNextTaskIdForUserLocked(mStartActivity.userId), 
  8.                         mNewTaskInfo != null ? mNewTaskInfo : mStartActivity.info, 
  9.                         mNewTaskIntent != null ? mNewTaskIntent : mIntent, mVoiceSession, 
  10.                         mVoiceInteractor, !mLaunchTaskBehind /* toTop */, mStartActivity.mActivityType); 
  11.                 //其他代碼略 
  12.             } 
  13.         } 
  14.     } 

3、ActivityStack

ActivityStack,內(nèi)部維護(hù)了一個(gè)ArrayList,用來(lái)管理TaskRecord;

  1. class ActivityStack<T extends StackWindowController> extends ConfigurationContainer implements StackWindowListener { 
  2.         private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();//使用一個(gè)ArrayList來(lái)保存TaskRecord 
  3.         final int mStackId; 
  4.         protected final ActivityStackSupervisor mStackSupervisor;//持有一個(gè)ActivityStackSupervisor,所有的運(yùn)行中的ActivityStacks都通過(guò)它來(lái)進(jìn)行管理 
  5.         //構(gòu)造方法 
  6.         ActivityStack(ActivityStackSupervisor.ActivityDisplay display, int stackId, 
  7.                       ActivityStackSupervisor supervisor, RecentTasks recentTasks, boolean onTop) { 
  8.         } 
  9.         TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent, 
  10.                                     IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 
  11.                                     boolean toTop, int type) { 
  12.             //創(chuàng)建一個(gè)task 
  13.             TaskRecord task = new TaskRecord(mService, taskId, info, intent, voiceSession, voiceInteractor, type); 
  14.             //將task添加到ActivityStack中去 
  15.             addTask(task, toTop, "createTaskRecord"); 
  16.             //其他代碼略 
  17.             return task; 
  18.         } 
  19.         //添加Task 
  20.         void addTask(final TaskRecord task, final boolean toTop, String reason) { 
  21.             addTask(task, toTop ? MAX_VALUE : 0, true /* schedulePictureInPictureModeChange */, reason); 
  22.             //其他代碼略 
  23.         } 
  24.         //添加Task到指定位置 
  25.         void addTask(final TaskRecord task, int position, boolean schedulePictureInPictureModeChange, 
  26.                      String reason) { 
  27.             mTaskHistory.remove(task);//若存在,先移除 
  28.             //... 
  29.             mTaskHistory.add(position, task);//添加task到mTaskHistory 
  30.             task.setStack(this);//為T(mén)askRecord設(shè)置ActivityStack 
  31.             //... 
  32.         } 
  33.         //其他代碼略 
  34.     } 
  • 看到ActivityStack使用了一個(gè)ArrayList來(lái)保存TaskRecord;
  • 另外,ActivityStack中還持有ActivityStackSupervisor對(duì)象,這個(gè)是用來(lái)管理ActivityStacks的;
  • ActivityStack是由ActivityStackSupervisor來(lái)創(chuàng)建的,實(shí)際ActivityStackSupervisor就是用來(lái)管理ActivityStack的,繼續(xù)看下面的ActivityStackSupervisor分析;

4、ActivityStackSupervisor

ActivityStackSupervisor,顧名思義,就是用來(lái)管理ActivityStack的;

  1. ActivityStackSupervisor,顧名思義,就是用來(lái)管理ActivityStack的; 
  2.     public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener { 
  3.         ActivityStack mHomeStack;//管理的是Launcher相關(guān)的任務(wù) 
  4.         ActivityStack mFocusedStack;//管理非Launcher相關(guān)的任務(wù) 
  5.         //創(chuàng)建ActivityStack 
  6.         ActivityStack createStack(int stackId, ActivityStackSupervisor.ActivityDisplay display, boolean onTop) { 
  7.             switch (stackId) { 
  8.                 case PINNED_STACK_ID: 
  9.                     //PinnedActivityStack是ActivityStack的子類(lèi) 
  10.                     return new PinnedActivityStack(display, stackId, this, mRecentTasks, onTop); 
  11.                 default
  12.                     //創(chuàng)建一個(gè)ActivityStack 
  13.                     return new ActivityStack(display, stackId, this, mRecentTasks, onTop); 
  14.             } 
  15.         } 
  16.     } 
  • ActivityStackSupervisor內(nèi)部有兩個(gè)不同的ActivityStack對(duì)象:mHomeStack、mFocusedStack,用來(lái)管理不同的任務(wù);
  • ActivityStackSupervisor內(nèi)部包含了創(chuàng)建ActivityStack對(duì)象的方法;
  • AMS初始化時(shí)會(huì)創(chuàng)建一個(gè)ActivityStackSupervisor對(duì)象;

二、啟動(dòng)流程和啟動(dòng)模式看任務(wù)棧

1、啟動(dòng)流程

啟動(dòng)Activity過(guò)程中涉及到的ActivityStack、TaskRecord、ActivityRecord、ActivityStackSupervisor進(jìn)行簡(jiǎn)單的分析,實(shí)際上一張時(shí)序圖就可以看明白了

  • startActivity時(shí)首先會(huì)創(chuàng)建一個(gè)ActivityRecord。
  • 如果有需要,會(huì)創(chuàng)建一個(gè)TaskRecord,并把這個(gè)TaskRecord加入到ActivityStack中。
  • 將ActivityRecord添加到TaskRecord的棧頂

2、啟動(dòng)模式中的任務(wù)棧

①standerd

默認(rèn)模式,每次啟動(dòng)Activity都會(huì)創(chuàng)建一個(gè)新的Activity實(shí)例

現(xiàn)在有個(gè)A Activity,我們?cè)贏上面啟動(dòng)B,再然后在B上面啟動(dòng)A,其過(guò)程如圖所示

②singleTop

  • 如果要啟動(dòng)的Activity已經(jīng)在棧頂,則不會(huì)重新創(chuàng)建Activity,只會(huì)調(diào)用該該Activity的onNewIntent()方法。
  • 如果要啟動(dòng)的Activity不在棧頂,則會(huì)重新創(chuàng)建該Activity的實(shí)例;

現(xiàn)在有個(gè)A Activity,我們?cè)贏以standerd模式上面啟動(dòng)B,然后在B上面以singleTop模式啟動(dòng)A,其過(guò)程如圖所示,這里會(huì)新創(chuàng)建一個(gè)A實(shí)例

B上面以singleTop模式啟動(dòng)B的話,則不會(huì)重新創(chuàng)建B,只會(huì)調(diào)用onNewIntent()方法,其過(guò)程如圖所示

③singleTask

  • 如果要啟動(dòng)的Activity已經(jīng)存在于它想要?dú)w屬的棧中,那么不會(huì)創(chuàng)建該Activity實(shí)例,將棧中位于該Activity上的所有的Activity出棧,同時(shí)該Activity的onNewIntent()方法會(huì)被調(diào)用。
  • 如果要啟動(dòng)的Activity不存在于它想要?dú)w屬的棧中,并且該棧存在,則會(huì)創(chuàng)建該Activity的實(shí)例。
  • 如果要啟動(dòng)的Activity想要?dú)w屬的棧不存在,則首先要?jiǎng)?chuàng)建一個(gè)新棧,然后創(chuàng)建該Activity實(shí)例并壓入到新棧中

現(xiàn)在有個(gè)A Activity,我們?cè)贏以standerd模式上面啟動(dòng)B,然后在B上面以singleTask模式啟動(dòng)A,其過(guò)程如圖所示

④singleInstance

基本和singleTask一樣,不同的是啟動(dòng)Activity時(shí),首先要?jiǎng)?chuàng)建在一個(gè)新棧,然后創(chuàng)建該Activity實(shí)例并壓入新棧中,新棧中只會(huì)存在這一個(gè)Activity實(shí)例;

現(xiàn)在有個(gè)A Activity,我們?cè)贏以singleInstance模式上面啟動(dòng)B,其過(guò)程如圖所示:

3、啟動(dòng)Flag

startActivity()時(shí)往Intent 中加入相應(yīng)的標(biāo)志來(lái)指定啟動(dòng)模式,這種方式的優(yōu)先級(jí)會(huì)比在AndroidManifest中定義的優(yōu)先級(jí)高;但是AndroidManifest中只能定義四種啟動(dòng)方式:standard、singleTop、singleTask、singleInstance,而Intent的flag則有很多種。具體的可以看看文檔,我們這里看看部分flag:

  • FLAG_ACTIVITY_NEW_TASK :跟launchMode中的singleTask一樣。
  • FLAG_ACTIVITY_SINGLE_TOP :跟launchMode中的singleTop一樣。
  • FLAG_ACTIVITY_CLEAR_TOP :launchMode中沒(méi)有對(duì)應(yīng)的值,如果要啟動(dòng)的Activity已經(jīng)存在于棧中,則將所有位于它上面的Activity出棧。singleTask默認(rèn)具有此標(biāo)記位的效果【責(zé)任編輯:武曉燕 TEL:(010)68476606】

 

責(zé)任編輯:武曉燕 來(lái)源: Android開(kāi)發(fā)編程
相關(guān)推薦

2021-08-27 07:38:21

AndroidDialogContext

2009-09-25 14:23:39

2009-09-28 10:39:01

Hibernate基礎(chǔ)

2009-03-24 08:30:54

AndroidGoogle移動(dòng)os

2009-03-24 09:17:58

驅(qū)動(dòng)GSMAndroid

2013-12-04 10:21:38

AndroidAndroidMani

2010-02-06 15:19:35

2009-09-09 09:48:43

Linq延遲加載

2009-09-14 16:21:34

LINQ To XML

2009-06-18 14:00:51

2009-10-10 13:52:57

VB Update方法

2009-09-14 13:50:35

LINQ編程模型

2009-09-08 15:56:50

Linq使用Group

2010-01-06 13:50:37

.NET Framew

2009-11-20 13:11:44

Oracle XML數(shù)

2009-12-16 14:09:14

Visual Stud

2009-09-03 17:57:06

C#聲明事件

2009-09-04 15:43:07

C#流模型

2009-09-07 13:19:44

C#線程同步

2010-04-26 18:17:19

Oracle存儲(chǔ)過(guò)程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕视频在线 | 亚洲一卡二卡 | 国产一区二区三区在线看 | 99热热| 精品欧美一区二区三区精品久久 | 亚州av在线| 欧美jizzhd精品欧美巨大免费 | 日韩一区二区成人 | 五月天激情综合网 | 日韩欧美在线观看视频 | 曰韩三级| 韩国毛片一区二区三区 | 国产精品久久精品 | 国产在线观看一区二区三区 | 免费观看的黄色网址 | av网站免费在线观看 | 欧美第一页 | 岛国毛片在线观看 | 欧美精品v | 国产精品资源在线 | 黄网站色大毛片 | 欧美精品一区二区蜜桃 | 精品乱码一区二区 | 亚洲欧美日韩电影 | 精品久久99 | 亚洲天堂一区 | 欧美最猛黑人 | 天天天操天天天干 | 麻豆精品久久久 | 91精品久久久久久久久 | 国产精品一区在线观看 | 国产成人精品999在线观看 | 久久国产日韩 | 夏同学福利网 | 国产精品国产成人国产三级 | 国产精品91视频 | 欧美精品久久久 | 成人a网 | 中文字幕一区二区三区不卡在线 | 国产精品美女久久久av超清 | 91国内外精品自在线播放 |