Android开发涉及到的AMS类和ActivityThread类源码解读
2021/7/19 12:34:48
本文主要是介绍Android开发涉及到的AMS类和ActivityThread类源码解读,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Android开发系统启动流程涉及到的AMS类和ActivityThread类
ZygoteInit - public static void main(String argv[]) {} - forkSystemServer() //fork系统进程 - mMethod.invoke(null, new Object[] { mArgs });//反射调用系统进程的那个ActivityThread类systemMain方法 public static ActivityThread systemMain() { //系统的 ActivityThread thread = new ActivityThread(); thread.attach(true, 0); return thread; } //如果不是系统的ActivityThread,还是调用Looper.loop();进入死循环,也就是为什么我们app不会退出的原因 ActivityThread extends ClientTransactionHandler public static void main(String[] args) { //普通 ActivityThread thread = new ActivityThread(); thread.attach(false, startSeq); Looper.loop(); } //将mAppThread传递给AMS系统进程 ActivityThread.attach(boolean system, long startSeq)//systemMain方法的对应为true - mgr.attachApplication(mAppThread, startSeq);
//首先搞清楚,是一部Android设备系统只有一个AMS进程,并不是每个应用有一个AMS进程 //一个app应用都有一个主进程ActivityThread实例,AMS通过ProcessList mProcessList持有每个应用的进程记录ProcessRecord //ProcessRecord进而持有ApplicationThread代理,ApplicationThread通过H:Handler与ActivityThread通信 //从main进程切换到AMS进程 ActivityManager.getService() //从AMS进程切换到main进程,通过ApplicationThread,在通过H:Handler与ActivityThread通信 IApplicationThread mAppThread //App启动后反射调用ActivityThread的main方法入口,然后调用attach方法,将IApplicationThread传递给AMS //ActivityThread类的ApplicationThread干嘛的知道了吧?就是IApplicationThread的代理类,用于和其他进程比如AMS通信的 //1.ActivityThread private void attach(boolean system, long startSeq) { final IActivityManager mgr = ActivityManager.getService(); mgr.attachApplication(mAppThread, startSeq); } //2.ActivityManagerService() final ActivityThread mSystemThread; //系统进程,和AMS同一个进程的ActivityThread final ProcessList mProcessList; //其他进程的进程列表,管理每个进程 private boolean attachApplicationLocked(IApplicationThread thread){ ProcessRecord app; generateApplicationProvidersLocked()//通过PMS获取xml注册的ContentProvider组件 thread.bindApplication(processName, appInfo, providerList,...)//将providerList传递给主进程 app.makeActive(thread, mProcessStats); //持有thread:ApplicationThread mProcessList.updateLruProcessLocked(app, false, null); //更新进程LRU列表 } //每个应用的Application创建的时机: //启动Activity的参数ActivityClientRecord r持有packageInfo:LoadedApk持有Application mApplication //makeApplication方法判断有Application对象直接返回,没有就创建一个 //ActivityThread private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { Application app = r.packageInfo.makeApplication(false, mInstrumentation); }
Context的实现类是ContextImpl
这篇关于Android开发涉及到的AMS类和ActivityThread类源码解读的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享
- 2024-11-15laydate怎么取消初始日期校验?-icode9专业技术文章分享
- 2024-11-15SendGrid 的邮件发送时,怎么设置回复邮箱?-icode9专业技术文章分享
- 2024-11-15使用 SendGrid API 发送邮件后获取到唯一的请求 ID?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 tags标签最多有多少个?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 怎么批量发送给多个人?-icode9专业技术文章分享
- 2024-11-15如何搭建web开发环境并实现 web项目在浏览器中访问?-icode9专业技术文章分享