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

本文详细解析了Android应用启动流程,从ActivityThread.main方法开始,介绍了如何初始化ActivityThread,Application和Context的设置过程,以及Activity的创建过程。

首先我们应该知道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

java.lang.ExceptionInInitializerError at com.jeremyliao.liveeventbus.core.LiveEventBusCore.get(LiveEventBusCore.java:48) at com.jeremyliao.liveeventbus.LiveEventBus.get(LiveEventBus.java:35) at com.yjspznzs.jrzfsp.activity.MainActivity.initView(MainActivity.java:163) at com.yjspznzs.jrzfsp.activity.MainActivity.onCreate(MainActivity.java:103) at android.app.Activity.performCreate(Activity.java:8897) at android.app.Activity.performCreate(Activity.java:8859) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1470) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4039) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4217) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:99) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2630) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:222) at android.os.Looper.loop(Looper.java:314) at android.app.ActivityThread.main(ActivityThread.java:8788) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1090) Caused by: java.lang.SecurityException: com.yjspznzs.jrzfsp: One of RECEIVER_EXPORTED or RECEIVER_NOT_EXPORTED should be specified when a receiver isn't being registered exclusively for system broadcasts at android.os.Parcel.createExceptionOrNull(Parcel.java:3079) at android.os.Parcel.createException(Parcel.java:3063) at android.os.Parcel.readException(Parcel.java:3046) at android.os.Parcel.readException(Parcel.java:2988) at android.app.IActivityManager$Stub$Proxy.registerReceiverWithFeature(IActivityManager.java:6233) at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1863) at android.app.ContextImpl.registerReceiver(ContextImpl.java:1803) at android.app.ContextImpl.registerReceiver(ContextImpl.java:1791) at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:766) at com.jeremyliao.liveeventbus.core.LiveEventBusCore.registerReceiver(LiveEventBusCore.java:127) at com.jeremyliao.liveeventbus.core.LiveEventBusCore.<init>(LiveEventBusCore.java:83) at com.jeremyliao.liveeventbus.core.LiveEventBusCore.<init>(LiveEventBusCore.java:38) at com.jeremyliao.liveeventbus.core.LiveEventBusCore$SingletonHolder.<clinit>(LiveEventBusCore.java:44) at com.jeremyliao.liveeventbus.core.LiveEventBusCore.get(LiveEventBusCore.java:48)  at com.jeremyliao.liveeventbus.LiveEventBus.get(LiveEventBus.java:35)  at com.yjspznzs.jrzfsp.activity.MainActivity.initView(MainActivity.java:163)  at com.yjspznzs.jrzfsp.activity.MainActivity.onCreate(MainActivity.java:103)  at android.app.Activity.performCreate(Activity.java:8897)  at android.app.Activity.performCreate(Activity.java:8859)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1470)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4039)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4217)  at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)  at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)  at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:99)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2630)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loopOnce(Looper.java:222)  at android.os.Looper.loop(Looper.java:314)  at android.app.ActivityThread.main(ActivityThread.java:8788)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:569)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1090)  Caused by: android.os.RemoteException: Remote stack trace: at com.android.server.am.ActivityManagerService.registerReceiverWithFeature(ActivityManagerService.java:14786) at android.app.IActivityManager$Stub.onTransact$registerReceiverWithFeature$(IActivityManager.java:12302) at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:3218) at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2911) at android.os.Binder.execTransactInternal(Binder.java:1346)
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值