源码阅读---Activity启动中应用进程的创建
来源:互联网 发布:淘宝店铺市场 编辑:程序博客网 时间:2024/06/06 16:41
问题1
追踪Activity启动流程的过程中,在StartSpecificActivityLocked方法中如果应用进程没有启动的话会去先启动进程。对于同一个应用中的Activity跳转,不特殊指定(使用android:process属性)的话是不会走这一流程,但在Launcher启动应用时会创建进的进程。另一种情况:一个应用APP1启动另一个应用APP2中的Activity,不指定NEW_TASK和lanchMode的情况下,activity会共用当前Task,那会共用进程吗?
可以看到两个Activity处于不同的进程中ProcessRecord{13b9c682 1986:org.buddha.wise/u0a128}和ProcessRecord{2bcd90f6 1907:com.example.seedinwind.mystudy/u0a129}
在StartSpecificActivityLocked中
ProcessRecord app = mService.getProcessRecordLocked(r.processName, r.info.applicationInfo.uid, true);if (app != null && app.thread != null) { .... return;} mService.startProcessLocked(r.processName,r.info.applicationInfo, true,0,"activity",r.intent.getComponent(), false, false, true);
当app != null && app.thread != null时会走创建进程的流程。获取app时,会用到r.processName,看一下ActivityRecord的构造
if ((aInfo.flags&ActivityInfo.FLAG_MULTIPROCESS) != 0&& _caller != null&& (aInfo.applicationInfo.uid == Process.SYSTEM_UID|| aInfo.applicationInfo.uid == _caller.info.uid)) { processName = _caller.processName; } else { processName = aInfo.processName; }
当被启动的系统应用或要启动的应用与被启动的是有相同的uid(而且Activity在Manifest文件设置了MultiProcess属性)才会与当前进程有相同的进程名称,上面例子对应的进程名称和进程uid分别是org.buddha.wise/u0a128和com.example.seedinwind.mystudy/u0a129,所以会为APP2启动新的进程。
问题2
使用android:process属性,指定进程是怎么实现的?
需要注意的是当一个应用对应多个进程时,Application对象会创建多次,因为进程创建后会与应用端进行绑定操作,期间会创建Application对象
可以看到启动了两个进程,都对应相同的uid–u0a129,这里因为Activity设置了android:process属性更改了进程名,所以会启动一个新的进程。默认不设置时进程名与应用包名一致。以下是processName属性的定义
ComponentInfo
/*** The name of the process this component should run *in.* From the "android:process" attribute or, if not *set, the same* as <var>applicationInfo.processName</var>.*/public String processName;
ApplicationInfo
/** * The name of the process this application should run in. From the * "process" attribute or, if not set, the same as * <var>packageName</var>. */public String processName;
但是如果是同时设置了multiProcess属性,这个Activity不会重启一个新的进程:
进程创建与应用启动流程
1.创建进程:创建ProcessRecord对象并保存到相应数据结构。调用本地方法启动进程
2.在进程启动后,主线程会执行ActivityThread中的main方法(类似于java中的main函数,这是应用的入口)。这里会启动主线程的消息循环,创建ActivityThread对象并调用attach()方法,这里会通过Binder机制调用WMS的attachApplication与之前创建的ProcessRecord进行关联,并异步回调ActivityThread的bindApplication方法。如果进程正在启动Activity会调用ActivityStackSupervisor的attachApplicationLocked方法处理Activity的生命周期流程
3.ActivityThread.bindApplication触发应用端的初始化工作,包括初始化上下文环境–创建ContextImpl,创建Instrumentation对象,创建Application对象并调用期onCreate方法
- 源码阅读---Activity启动中应用进程的创建
- Android系统源码阅读(3):子Activity在进程内的启动过程
- Android系统源码阅读(15):Android 应用进程的启动
- 【1】Android源码阅读:一个Activity是如何启动的?
- Android入门 —— activity的启动流程源码阅读
- 源码阅读---AMS与Activity启动流程
- android 启动新 app 的activity 新进程的创建
- Android源码解析之应用程序在新的进程中启动新的Activity的方法和过程分析
- 从应用启动看Activity的创建过程
- flask源码阅读 应用启动流程
- 源码分析Android 应用进程的启动过程
- android N进程启动流程(二)(上一个activity的暂停、进程启动、绑定进程与创建application)
- Android系统源码阅读(4):Service在新进程中启动过程
- Android系统源码阅读(2):根Activity组件的启动过程
- Android 6.0 AMS分析的第二条线:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互等知识;
- Activity启动过程中View的创建、绑定与绘制
- 内核源码阅读(七)新程序的启动与进程的退出
- Activity的启动和创建
- HEX和BIN
- 响应式网页开发你不知道的那些事
- Java集合类随手记——ArrayList
- 前端 Meta 用法大汇总
- @Controller和@RestController的区别
- 源码阅读---Activity启动中应用进程的创建
- socket API和TCP/IP协议学习
- vue-animated-list
- cron表达式详解
- 转载:Introducing the software testing ice-cream cone (anti-pattern)
- C# 上位机串口调试工具实时显示
- oracle怎么计算两个常数的求和,如1+1,或者求两个表count(*)的和········用from dual;
- vue之项目静态资源打包
- 萤石云视频EZOpenSDK集成(实现播放,视频放大功能)