Activity的工作过程(三) : Activity生命周期回调是如何被回调的

本文通过源码分析,详细阐述了Android中Activity生命周期回调的调用过程。从主线程创建ActivityThread对象开始,到通过Binder机制与系统服务ActivityManager建立通信,再到最终触发Activity生命周期方法的回调,整个流程清晰呈现。
摘要由CSDN通过智能技术生成

本文,将从源码角度分析Activity生命周期回调是如何被调用的。
若无特殊说明,源码分析部分采用api为: 21.0.3.

java程序有main方法作为入口一样,Android程序也有入口,ActivityThreadmain方法就是Android程序的入口。

Zygote启动时,会分裂出system_server并进行不断地ipc轮询,system_server会创建AMS等服务。当你在桌面点击一个app图标时,并且这个app在内存中是无实例的。AMS会通知system_server,由system_server通知Zygotefork出子进程并执行ActivityThreadmain方法。main方法的调用是在子进程的主线程中。

ActivityThreadmain方法如下所示:

ActivityThread.class

代码片1
public static void main(String[] args) {
   

       // 省略无关代码

        Looper.prepareMainLooper();

        ActivityThread thread = new ActivityThread();     // --->这里是关键,创建了ActivityThread 
        thread.attach(false);      // ---->调用其attach()方法  ---->分析1A

        if (sMainThreadHandler == null) {
   
            sMainThreadHandler = thread.getHandler();
        }

        AsyncTask.init();

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

        Looper.loop();

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

先创建ActivityThread对象,再attach()attach()的分析如下(即代码片1的分析1A):

ActivityThread.class

代码片2
 private void attach(boolean system) {
   
        sCurrentActivityThread = this;
        
        // 省略无关代码
            //mgr实际是系统服务注意是系统服务 ActivityManager
            //在此Android程序这里的本地代理,mgr可以与系统服务ActivityManager通信
            final IActivityManager mgr = ActivityManagerNative.getDefault();   --->分析2A
            try {
   
                mgr.attachApplication(mAppThread);     ---->分析2B
            } catch (RemoteException ex) {
   
                // Ignore
            }
            
            //省略无关代码
    }

代码片2分析2B中,mAppThread对象究竟是什么类型呢?如下:

 private class ApplicationThread extends ApplicationThreadNative {
   
public abstract class ApplicationThreadNative extends Binder implements IApplicationThread {
   
public interface IApplicationThread extends IInterface {
   

通过上面3个继承或实现接口关系,我们可以看出:

(1) mAppThread的类型是ApplicationThread

(2) 看到BinderIInterface .就知道原来这ApplicationThread是想对外提供远程服务

(3) 也就是说在某是远端会持有ApplicationThread的本地代理

(4) 说白了,这里又是Binder通信而已.

分析2A即 IActivityManager mgr = ActivityManagerNative.getDefault()

点击 ActivityManagerNative.getDefault() 部分,代码如下:

ActivityManagerNative.class

代码片3
 static public IActivityManager getDefault() {
   
        return gDefault.get();
 }

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
   
        protected IActivityManager create() {
   
            IBinder b = ServiceManager.getService("activity");      --->分析3A
            if (false) {
   
                Log.v("ActivityManager", "default service binder = " +
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值