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的Uid
String _launchedFromPackage, //启动Activity的包名
Intent _intent, //启动的Intent
String _resolvedType, //调用的包名
ActivityInfo aInfo, //Activity的信息
Configuration _configuration, //Activity的配置信息
ActivityRecord _resultTo, //parent Activity的信息
String _resultWho, //parent Activity的包名
int _reqCode, //startActivityForResult中的RequestCode
boolean _componentSpecified, //boolean componentSpecified = intent.getComponent() != null;
ActivityStackSupervisor supervisor,
ActivityContainer container, //大多数为null,一些特殊的启动方式会有值.
Bundle options)
然后就会传入到我们启动Activity的过程,
Step 2 :ActivityStackSupervisor.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 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); //对于新栈,直接插入就好, mWindowManager.moveTaskToTop(taskId); } TaskRecord task = null; **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。** **深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。** ![img](https://img-blog.csdnimg.cn/img_convert/72c063858b1bfefa34d11e1faf4cf663.png) ![img](https://img-blog.csdnimg.cn/img_convert/628abd0dbef16d566822b6552bb59851.png) ![img](https://img-blog.csdnimg.cn/img_convert/fea2ec4b70690b39fce68783b7e2639d.png) ![img](https://img-blog.csdnimg.cn/img_convert/47612e885864da7f6aaff821f40ebed5.png) ![](https://img-blog.csdnimg.cn/img_convert/5fc1545c2fd7974b8edd0d097b4ec2a7.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!** **由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!** **如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)** ### 尾声 评论里面有些同学有疑问关于如何学习material design控件,我的建议是**去GitHub搜**,有很多同行给的例子,这些栗子足够入门。 有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,**无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。** **至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。** **一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。** **初学者,一句话,多练。** **《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》[点击传送门即可获取!](https://bbs.csdn.net/forums/f76c2498e3b04ae99081eaf6e6cf692c)** 关于如何学习material design控件,我的建议是**去GitHub搜**,有很多同行给的例子,这些栗子足够入门。 有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,**无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。** **至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。** **一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。** **初学者,一句话,多练。** **《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》[点击传送门即可获取!](https://bbs.csdn.net/forums/f76c2498e3b04ae99081eaf6e6cf692c)**