2019独角兽企业重金招聘Python工程师标准>>> hot3.png

首先我们应该知道2个概念;

  1. 我们应该知道在Android中一个app就是一个进程;
  2. 我们在普通的Java程序中一个程序的入口是main方法,其实就是启动一个Java进程,然后这个Java进程就会启动一个主线程。
  3. Android 系统间有很多进程, AMS, PMS 等都是独立进程,app 都要和这些进程进行通信;

同理在 Android 中也是启动一个进程,然后执行 main 方法,这个启动类就是 ActivityThread.java; 所以首先执行的应该是 ActivityThread 的 main 方法;

public static void main(String[] args) {SamplingProfilerIntegration.start();........// 初始化一个 LoopLooper.prepareMainLooper();// 创建 当前进程中最主要的对象ActivityThread thread = new ActivityThread();// 初始化 application, Instrumentationthread.attach(false);......if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}// 主线程 循环; 应用第一个线程就不会停止了Looper.loop();
}

应用的进程启动的时候,首先调用的是 ActivityThread 的 main 方法, 在 main 方法中初始化一个 ActivityThread; 然后执行 ActivityThread 实例的 attach 方法, attach 中把 ApplicationThread 和 IActivityManager 关联起来(可以进行通信了), 并且和 ViewRootImpl 做了一些关联(以后再研究);

ActivityThread 有个内部 ApplicationThread 类;这个主要用于和 Android 系统的 AMS 进行系统进程通信;

Activity 被 ActivityThread 启动的过程

查看方法名 android.app.ActivityThread#performLaunchActivity

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {// System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");// 创建 activityactivity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);try {// 获得 ApplicationApplication app = r.packageInfo.makeApplication(false, mInstrumentation);// 创建 contextContext appContext = createBaseContextForActivity(r, activity);CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());Configuration config = new Configuration(mCompatConfiguration);if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "+ r.activityInfo.name + " with config " + config);// activity 中把 context 放进去,把 appliaction也放进去, 且在 attach 的时候,把activity 的windown 创建好了activity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstances, config);// 把一些样式放进去activity.mCalled = false;// 调用 activity 的 onCreate方法mInstrumentation.callActivityOnCreate(activity, r.state);mActivities.put(r.token, r);//....................return activity;}

从上面的代码中可以看出来,activity 的创建和 context, application 的赋值过程都是在 ActivityThread 中进行的。 且流程是

new Activity --> 设置 application ---> 设置 ContextImpl --> attach() --> attachBaseContext() --> onCreate()

为什么我要把这个过程列出来,主要是为了了解 applicationContext 和 Activity 的 context 的创建过程;

以上所有的都是正常使用 Java 创建类的思路去理解,对应 activity 的一些生命周期的管理也是从这里开始的;

转载于:https://my.oschina.net/jiemachina/blog/1548018

【Android】 01. APP 进程启动和 ActivityThread 的关系相关推荐

  1. 从源码角度看Android系统SystemServer进程启动过程

    SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务. 备注:本文将结合Android8.0的源码看SystemServer进程的启动 ...

  2. 从源码角度看Android系统Zygote进程启动过程

    在Android系统中,DVM.ART.应用程序进程和SystemServer进程都是由Zygote进程创建的,因此Zygote又称为"孵化器".它是通过fork的形式来创建应用程 ...

  3. Android中app进程ABI确定过程

    更多干货,请关注微信公众号: tmac_lover 所谓的ABI全称是application binary interface,是一个机器语言级别的接口,描述的是二进制代码之间的兼容性,也就是说一起工 ...

  4. Android之rild进程启动源码分析

    Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...

  5. Android应用程序进程启动过程的源代码分析(1)

    Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制:这两个特点都是在进程的初始化过程中实 ...

  6. Android应用程序进程启动过程

    相关文章 Android系统架构与系统源码目录 Android系统启动流程(一)解析init进程启动过程 Android系统启动流程(二)解析Zygote进程启动过程 Android系统启动流程(三) ...

  7. Android应用程序进程启动流程

    在学习应用程序进程启动流程前,先要弄清楚系统启动流程,如果有不清楚的同学,建议先看下以前博主的文章: Android系统启动(上篇)_AD钙奶-lalala的博客-CSDN博客 Android系统启动 ...

  8. 从源码角度看Android系统init进程启动过程

    init进程是Linux系统中用户空间的第一个进程,进程号为1.Kernel启动后,在用户空间启动init进程,并调用/system/core/init.cpp中的main方法执行一些重要的工作. 备 ...

  9. Android系统init进程启动及init.rc全解析

    这是一篇用心写的博客,也希望大家用心看并帮忙找到文章的改进之处,谢谢: 服务启动机制 system/core/init/init.c文件main函数中parse_config_file(init.rc ...

最新文章

  1. 不要说自己没什么兴趣,也不要说自己兴趣很广泛,最好能具体到哪个方面,顺便提一下你最近看的一本该方面的书,有什么收获(转)...
  2. 【Python】青少年蓝桥杯_每日一题_9.27_输出最大值最小值平均值
  3. 互联网1分钟 | 1011
  4. Codeforce-CodeCraft-20 (Div. 2)-B. String Modification (找规律+模拟)
  5. 为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!
  6. Java中如何实现每天定时对数据库的操作
  7. OpenCV人脸识别之二:模型训练
  8. 智能运维 devops_Coffee Shop DevOps:如何使用反馈循环变得更智能
  9. mybaits 返回ListString
  10. Linux kernel kfifo分析【转】
  11. 虚拟人出新晋卷王,无薪工作70天却没人认出来
  12. mysql 局域网数据库共享,SQL Server 2005 在局域网中共享数据库
  13. iPhone~iPhone14屏幕尺寸和分辨率的相关知识 ( DPI vs PPI pt vs px)
  14. Linux命令之md5sum
  15. 黑盒测试中的因果图约束条件解释
  16. 如何在 Linux 系统中添加桌面图标
  17. mysql优化慕课网_性能优化之MySQL优化(慕课)
  18. 淘宝店铺商品搬家到微店
  19. 解决/dev/fb0无法打开的问题
  20. 负载测试、压力测试和性能测试的异同

热门文章

  1. 这是一个不完整的详细Java多线程,但对于初学者足够了,相信我,你会爱上她的
  2. CSDN中Markdown编辑器的数学公式编写(非常详细!)
  3. UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 658: illegal multibyte sequence
  4. HTML的BODY内标签介绍
  5. 对不队—— Alpha冲刺
  6. sql server 根据身份证号计算出生日期和年龄的存储过程
  7. org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed
  8. 静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
  9. 计算机视觉进展二十年 (1995~2015)
  10. Linux下得到显示屏参数的方法