Activity的代表ActivityRecord

2024-05-15 20:48

本文主要是介绍Activity的代表ActivityRecord,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ActivityRecord 是Activity的标识,与每个Activity是一一对应的,
下面我们来介绍他的创建过程
这个既然是代表Activity,那么肯定是在启动Activity的时候,来创建的。
Step 1 :ActivityStackSupervisor.java
final int startActivityLocked(IApplicationThread caller,Intent intent, String resolvedType, ActivityInfo aInfo,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,IBinder resultTo, String resultWho, int requestCode,int callingPid, int callingUid, String callingPackage,int realCallingPid, int realCallingUid, int startFlags, Bundle options,boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container,TaskRecord inTask) {ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,requestCode, componentSpecified, this, container, options);err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor,startFlags, true, options, inTask);
}

    ActivityRecord( ActivityManagerService _service,     ProcessRecord _caller,         //调用者的进程,与aInfo一起来决定当前Activity的应用包名int _launchedFromUid,		  //启动Activity的UidString _launchedFromPackage,    //启动Activity的包名Intent _intent, 				           //启动的IntentString _resolvedType,	         //调用的包名ActivityInfo aInfo,             //Activity的信息Configuration _configuration,    //Activity的配置信息ActivityRecord _resultTo,       //parent Activity的信息String _resultWho,              //parent Activity的包名int _reqCode,                    //startActivityForResult中的RequestCodeboolean _componentSpecified,   //boolean componentSpecified = intent.getComponent() != null;ActivityStackSupervisor supervisor,ActivityContainer container,   //大多数为null,一些特殊的启动方式会有值.Bundle options)
然后就会传入到我们启动Activity的过程,
Step 2 :ActivityStackSupervisor.java

<pre style="border: 0px; margin-top: 0px; margin-bottom: 0px; background-color: rgb(255, 255, 255);"><pre name="code" class="java">    final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags,boolean doResume, Bundle options, TaskRecord inTask) {if (r.resultTo == null && inTask == null && !addingToTask&& (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {newTask = true;targetStack = adjustStackFocus(r, newTask);                                           //这一步相当于找到Activity所在的栈,下一部是移动的操作if (!launchTaskBehind) {targetStack.moveToFront("startingNewTask");                                       //将当前的ActivityStack从栈里移到栈顶。}if (reuseTask == null) {r.setTask(targetStack.createTaskRecord(getNextTaskId(),                           //这里是创建一个新的Task,作为要启动的Activity所在的栈,这里有一个唯一的TaskId标识,方法是每次id++查找一遍,如果已经存在则再++查找,感觉这里效率是可以优化的。geNextTaskId()在Step 3中,感兴趣的可以提出优化方法一起讨论一下。newTaskInfo != null ? newTaskInfo : r.info,newTaskIntent != null ? newTaskIntent : intent,voiceSession, voiceInteractor, !launchTaskBehind /* toTop */),taskToAffiliate);if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +r.task);}} else if (sourceRecord != null) {......										//这里过程类似,省略掉} else if (inTask != null) {......} else {// This not being started from an existing activity, and not part// of a new task...  just put it in the top task, though these days// this case should never happen.targetStack = adjustStackFocus(r, newTask);targetStack.moveToFront("addingToTopTask");ActivityRecord prev = targetStack.topActivity();r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(),                     //这里则是另一种情况,新启动的Activity与之前的Activity公用一个栈。r.info, intent, null, null, true), null);mWindowManager.moveTaskToTop(r.task.taskId);if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r+ " in new guessed " + r.task);}



Step 3 ActivityStackSupervisor.java
    int getNextTaskId() {do {mCurTaskId++;if (mCurTaskId <= 0) {mCurTaskId = 1;}} while (anyTaskForIdLocked(mCurTaskId) != null);return mCurTaskId;}
TaskRecord anyTaskForIdLocked(int id) {int numDisplays = mActivityDisplays.size();for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {ActivityStack stack = stacks.get(stackNdx);TaskRecord task = stack.taskForIdLocked(id);if (task != null) {return task;}}}// Don't give up! Look in recents.if (DEBUG_RECENTS) Slog.v(TAG, "Looking for task id=" + id + " in recents");TaskRecord task = mService.recentTaskForIdLocked(id);if (task == null) {if (DEBUG_RECENTS) Slog.d(TAG, "\tDidn't find task id=" + id + " in recents");return null;}if (!restoreRecentTaskLocked(task)) {if (DEBUG_RECENTS) Slog.w(TAG, "Couldn't restore task id=" + id + " found in recents");return null;}if (DEBUG_RECENTS) Slog.w(TAG, "Restored task id=" + id + " from in recents");return task;}
 
Step 4 : ActivityStack.java 
 
    final void startActivityLocked(ActivityRecord r, boolean newTask,boolean doResume, boolean keepCurTransition, Bundle options) {TaskRecord rTask = r.task;final int taskId = rTask.taskId;// mLaunchTaskBehind tasks get placed at the back of the task stack.if (!r.mLaunchTaskBehind && (taskForIdLocked(taskId) == null || newTask)) {// Last activity in task had been removed or ActivityManagerService is reusing task.// Insert or replace.// Might not even be in.insertTaskAtTop(rTask);                                                       <span style="white-space:pre">		</span>//对于新栈,直接插入就好,mWindowManager.moveTaskToTop(taskId);}TaskRecord task = null;if (!newTask) {// If starting in an existing task, find where that is...boolean startIt = true;for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {task = mTaskHistory.get(taskNdx);if (task.getTopActivity() == null) {// All activities in task are finishing.continue;}if (task == r.task) {// Here it is!  Now, if this is not yet visible to the// user, then just add it without starting; it will// get started when the user navigates back to it.if (!startIt) {if (DEBUG_ADD_REMOVE) Slog.i(TAG, "Adding activity " + r + " to task "+ task, new RuntimeException("here").fillInStackTrace());task.addActivityToTop(r);<span style="white-space:pre">						</span>//之前都是针对栈的操作。这里才是将当前的Activity移植栈顶。r.putInHistory();<span style="white-space:pre">							</span>//这里就是对ActivityRecord的一个标志位的设置mWindowManager.addAppToken(task.mActivities.indexOf(r), r.appToken,     //这里是单独记录AppWindowToken可以把他理解我Activity对应的window的唯一标识,这里就是将Activity与Window挂起来的地方。r.task.taskId, mStackId, r.info.screenOrientation, r.fullscreen,(r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,r.userId, r.info.configChanges, task.voiceSession != null,r.mLaunchTaskBehind);if (VALIDATE_TOKENS) {validateAppTokensLocked();}ActivityOptions.abort(options);return;}break;} else if (task.numFullscreen > 0) {startIt = false;}}}






 
 
 
 

                                    

这篇关于Activity的代表ActivityRecord的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/992880

相关文章

在 Java 中,JDK、JRE、JVM 分别代表什么,有何关系和区别?

在Java开发的世界中,我们会经常听到JDK、JRE和JVM这三个词。它们都与Java的运行环境以及Java程序的编译和运行有关,它们之间也存在一些关联性和区别。 什么是JDK、JRE和JVM 我们来看它们分别是什么。 JDK,全称Java Development Kit,即Java开发工具包。顾名思义,JDK是用于Java开发的一套工具包,里面包含了Java的编译器javac、

iOS 到处 ipa包的时候 会有四个选项分别代表什么

如图 在 iOS 到处 ipa包的时候 会有四个选项  1.Save for iOS App Store Deployment 保存到本地 准备上传App Store 或者在越狱的iOS设备上使用 2.Save for Ad Hoc Deployment 保存到本地 准备在账号添加的可使用设备上使用(具体为在开发者账户下添加可用设备的udid),该app包是发布证书编

滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理

上周末,滴滴与360都开源了各自的插件化框架,VirtualAPK与RePlugin,作为一个插件化方面的狂热研究者,在周末就迫不及待的下载了Virtualapk框架来进行研究,本篇博客带来的是VirtualAPK原理解析的第一篇Activity管理,博客只是自己的理解,小弟才疏学浅,可能有很多理解不对的地方,欢迎各位大神指出。(看博客之前,请大家先下载VirtualVirtualAPKapk的项

【Android面试八股文】来说一说Activity,Window,View三者的联系和区别吧

文章目录 ActivityWindowView为什么需要 Window?Window和View的关系Activity与Window的关系示例流程图示总结扩展阅读 在Android应用程序开发中, Activity、Window 和 View 是构建用户界面的核心组件。它们之间有着紧密的联系,但角色和职责各不相同。下面是对它们联系和区别的详细解释: Ac

为什么 JakeWharton 建议:App 只要用到一个 Activity ?

我们来看看这条回答都提到了哪些内容,对 Activity 和 Fragment 之间的爱恨情仇有何独到的见解,凭什么能得到 JakeWharton 本尊的青睐有加。 因为 Activity 是一个程序入口。你可以将其视为 app 的一个 main 函数。站在用户的立场上,通常你进入 app 的方式可能包括以下几种: launcher 桌面程序(main 函数入口); 来自参数化 m

Activity的launchMode:singleTop,singleTask与singleInstance

转自:http://blog.csdn.net/gaojinshan/article/details/17392987 转自:http://www.cnblogs.com/fanchangfa/archive/2012/08/25/2657012.html Activity启动模式设置:         <activity android:name=".MainActivity" and

Android设置页面Activity全屏(隐藏导航栏、状态栏)

3、代码中设置:在setContentView 之前调用 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 注意: 当有全面屏

java中的0x00代表什么

0x在Java里面是16进制的表示,0x引导的数都是十六进制数 十六进制是计算机中数据的一种表示方法。同我们日常中的十进制表示法不一样,它由0-9,A-F组成。与10进制的对应关系是:0-9对应0-9;A-F对应10-15。 例如0xA,就是十六进制里的A,表示10进制里的10 同理,0x44就是十六进制里的44,表示10进制里的68

ViewPager+fragment回调Activity

业务描述 ViewPage中有四个Fragment,每一个Fragment中有一个按钮,给他门设置一个回调,在主Activity中操作具体的业务 public class CabinKindFragment extends Fragment implements View.OnClickListener{@BindView(R.id.begin)Button btnBegin;//定义用来与外部

生成模型的两大代表:VAE和GAN

生成模型 给定数据集,希望生成模型产生与训练集同分布的新样本。对于训练数据服从\(p_{data}(x)\);对于产生样本服从\(p_{model}(x)\)。希望学到一个模型\(p_{model}(x)\)与\(p_{data}(x)\)尽可能接近。 这也是无监督学习中的一个核心问题——密度估计问题。有两种典型的思路: 显式的密度估计:显式得定义并求解分布\(p_{model}(x)\),