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

首先我们应该知道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();
        ........
        // 初始化一个 Loop
        Looper.prepareMainLooper();

        // 创建 当前进程中最主要的对象
        ActivityThread thread = new ActivityThread();

        // 初始化 application, Instrumentation
        thread.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 + ")");

        // 创建 activity
        activity = mInstrumentation.newActivity(
                    cl, component.getClassName(), r.intent);

        try {
            // 获得 Application
            Application app = r.packageInfo.makeApplication(false, mInstrumentation);
            
                // 创建 context
                Context 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是什么问题FATAL EXCEPTION: main Process: com.example.lightcontrol_app2, PID: 4533 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lightcontrol_app2/com.example.lightcontrol_app2.ui.control.activity.EditingSingleLampActivity}: java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2668) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2729) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6176) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783) Caused by: java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner. at android.widget.Spinner.setOnItemClickListener(Spinner.java:571) at com.example.lightcontrol_app2.ui.control.activity.EditingSingleLampActivity.init(EditingSingleLampActivity.java:111) at com.example.lightcontrol_app2.ui.control.activity.EditingSingleLampActivity.onCreate(EditingSingleLampActivity.java:65) at android.app.Activity.performCreate(Activity.java:6692) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2621) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2729) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1480) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6176) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
06-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值