android activity

  1. Activity实例化:
// 0.activity 对象被创建了。通过反射的方式创建的
android.app.Instrumentation#newActivity(java.lang.ClassLoader, 
java.lang.String, android.content.Intent)

// 1. call
android.app.ActivityThread#performLaunchActivity(ActivityClientRecord r,
Intent customIntent)

// 2. 
// -->
android.app.ActivityThread#handleResumeActivity(IBinder token,
            boolean clearHide, 
            boolean reallyResume, 
            int seq, 
            String reason)

handleResumeActivity()里面看到了什么?看到了,Activity虽说是用于显示界面的,但是实际上Activity并不具备这个能力,实际上显示界面还是通过WindowManager.addView()/updateView()来显示界面的。

android.app.ActivityThread#handleDestroyActivity(..)

这里会通过WindowManager去移除view.


ActivityThread里面提供了很多public void scheduleXXX()的方法,肯定是给外部调用的,比如scheduleLaunchActivity(),scheduleResumeActivity(),但是这些方法并没有去执行真正的逻辑,这些方法都发送了一个handler消息,不过msg.waht有区分。然后这些方法,对应的执行逻辑在handleXXX()方法里面,比如handleLaunchActivity()这样的方法里面。大部分 handlerXXX方法里面都会去调用一个performXXXX()方法比如performLaunchActivity()这样的方法。

从调用链上看是:

外部方法 –> scheduleXXX() –>[内部handler调用] handlerXXX() –> [handlerXXX内部] performXXX() –>[内部调用]mInstrumentation.callXXXX();。

比如 activity#onCreate()生命周期方法,就是在android.app.ActivityThread#performLaunchActivity()中被android.app.Instrumentation#callActivityOnCreate(android.app.Activity, android.os.Bundle)调用到的。这个方法里面调用了android.app.Activity#performCreate(android.os.Bundle) ,这个方法源码很短。但是代码很明确。

// Activity.java
final void performCreate(Bundle icicle) {
    restoreHasCurrentPermissionRequest(icicle);
    onCreate(icicle);  // 生命周期的回调方法。
    mActivityTransitionState.readState(icicle);
    performCreateCommon();
}

由此可知,Activity的生命周期方法全部是在ActivityThread里面被调用。至于ActivityThread是在哪被调用的,这个得继续分析了。

– 未完待续 –

然后,看到ActivityThread里面有一个main()方法,这个是不是就很激动了。每个java程序的入口。

看看这个main里面都有什么?

    public static void main(String[] args) {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
        SamplingProfilerIntegration.start();

        // CloseGuard defaults to true and can be quite spammy.  We
        // disable it here, but selectively enable it later (via
        // StrictMode) on debug builds, but using DropBox, not logs.
        CloseGuard.setEnabled(false);

        Environment.initForCurrentUser();

        // Set the reporter for event logging in libcore
        EventLogger.setReporter(new EventLoggingReporter());

        // Make sure TrustedCertificateStore looks in the right place for CA certificates
        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
        TrustedCertificateStore.setDefaultUserDirectory(configDir);

        Process.setArgV0("<pre-initialized>");
        // 关键代码来了,先创建了一个 looper 对象
        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();
        thread.attach(false);

        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler(); // 创建了一个 handler
        }

        if (false) {
            Looper.myLooper().setMessageLogging(new
                    LogPrinter(Log.DEBUG, "ActivityThread"));
        }

        // End of event ActivityThreadMain.
        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
        Looper.loop(); // 调用 looper.loop() 方法

        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

所有在这里也能看到为什么说UI线程的handler对象的创建,不需要手动设置looper了。因为已经存在了。UI线程到底是什么线程?就是main()所在的线程了,也就是通常意义上面的主线程。

但是,这里面并没有做上面其他的逻辑,仅仅是创建了一个looper和一个handler对象。

那么之前的分析,ActivityThread#scheduleXXX是被外部调用就是正确的。那么,到底是谁在调用这些方法呢?通过 grep命令很快找到了,是在com.android.server.am.ActivityStackSupervisor#realStartActivityLocked(...)里面调用的。

小结:
好了,先不看ActivityStackSupervisor,单单看ActivityThread,可以大致知道:

  1. ActivityThread里面启动了一个handler,然后等到外部调用activity相关的方法,等有人调用这些方法之后,就在handlerMessage()方法里面去执行对应的逻辑。比如启动一个Activity
  2. Activity实例是通过反射来创建,而不是通常的new操作符。
  3. Activity启动的时候会去关联到wm,然后通过wm.addView/updateView这样的方法去显示界面的。
  4. 结合Looper,Handler,Message,MessageQueue可知,主线程的Handler可以直接创建并使用,而子线程的Handler,必须手动在创建handler的前后调用looper.prepare()以及looper.loop()方法。
  5. Activity的生命周期方法,是被自己的performXXX()调用的,比如:performCreate(),而performCreate又是被android.app.Instrumentation#callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle)所调用的。
  6. Instrumentation#callActivityOnCreate是被android.app.ActivityThread#performLaunchActivity调用的,at.preformXXX是被自己的at.handlerXXX调用的,at.handlerXXX()被调用,是因为外部(ActivityStackSupervisor)调用了at.scheduleXXX方法。[这里的at,指的是ActivityThread对象]

以上。 —未完待续—

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值