android AMS—— 生命周期管理

在Android最新版本中,对于Activity的生命周期采用了事物控制来做处理


ClientTransaction.png

根据Activity生命周期对应生命周期事物

  • LaunchActivityItem
  • ResumeActivityItem
  • PauseActivityItem
  • StopActivityItem
  • DestroyActivityItem
    从类图中可以看出所有生命周期都是继承抽象出来的基类ClientTransactionItem。
                // Create activity launch transaction.
                final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,
                        r.appToken);
                clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                        System.identityHashCode(r), r.info,
                        // TODO: Have this take the merged configuration instead of separate global
                        // and override configs.
                        mergedConfiguration.getGlobalConfiguration(),
                        mergedConfiguration.getOverrideConfiguration(), r.compat,
                        r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,
                        r.persistentState, results, newIntents, mService.isNextTransitionForward(),
                        profilerInfo));

                // Set desired final state.
                final ActivityLifecycleItem lifecycleItem;
                if (andResume) {
                    lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());
                } else {
                    lifecycleItem = PauseActivityItem.obtain();
                }
                clientTransaction.setLifecycleStateRequest(lifecycleItem);

                // Schedule transaction.
                mService.getLifecycleManager().scheduleTransaction(clientTransaction);

创建一个ClientTransaction,并将LaunchActivityItem作为callback添加到mActivityCallbacks,而ResumeActivityItem或者PauseActivityItem作为LifecycleStateRequesst传递给mLifecycleStateRequest。最后通过ClientLifecycleManager执行该事务。

//先看ClientTransaction.java
    public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {
        ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);
        if (instance == null) {
            instance = new ClientTransaction();
        }
        instance.mClient = client;
        instance.mActivityToken = activityToken;

        return instance;
    }

    public void addCallback(ClientTransactionItem activityCallback) {
        if (mActivityCallbacks == null) {
            mActivityCallbacks = new ArrayList<>();
        }
        mActivityCallbacks.add(activityCallback);
    }
    public void setLifecycleStateRequest(ActivityLifecycleItem stateRequest) {
        mLifecycleStateRequest = stateRequest;
    }
    public void schedule() throws RemoteException {
        mClient.scheduleTransaction(this);
    }

obtain传入的参数IApplicationThread,是一个Binder的存根对象。实现它的ActivityThread的内部类,通过其可以实现跨进程的调用。

ClientLifecycleManager.java
    void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
        final IApplicationThread client = transaction.getClient();
        transaction.schedule();
        if (!(client instanceof Binder)) {
            // If client is not an instance of Binder - it's a remote call and at this point it is
            // safe to recycle the object. All objects used for local calls will be recycled after
            // the transaction is executed on client in ActivityThread.
            transaction.recycle();
        }
    }

ClientLifecycleManager的执行也是通过ClientTransaction去执行,最终通过IApplicationThread实现到APP端。ApplicationThread是一个本地Binder对象。到了AMS中这个接口就象征着远程代理对象。换句话说,此时会调用App端的scheduleTransaction方法。

public final class ActivityThread extends ClientTransactionHandler {

    private class ApplicationThread extends IApplicationThread.Stub {
        @Override
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
        }

  class H extends Handler {
      public void handleMessage(Message msg) {
                    final ClientTransaction transaction = (ClientTransaction) msg.obj;
                    mTransactionExecutor.execute(transaction);
                    if (isSystem()) {
                        transaction.recycle();
                    }
                    break;

      }
  }
 }

public abstract class ClientTransactionHandler {
    void scheduleTransaction(ClientTransaction transaction) {
        transaction.preExecute(this);
        sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
    }
}

从上面节选代码分析:ApplicationThread.scheduleTransaction——> ClientTransactionHandler.scheduleTransaction——> SendMessage到ActivityThread.H——> ActivityThread.H.handleMessage
在handleMessage中调用了TransactionExecutor.execute:

TransactionExecutor.java
    public void execute(ClientTransaction transaction) {
        final IBinder token = transaction.getActivityToken();
        executeCallbacks(transaction);//处理传递过来的ClientTransaction中的callback
        executeLifecycleState(transaction);//处理ClientTransaction中的LifecycleStateRequest
        mPendingActions.clear();
    }

  
    /** Cycle through all states requested by callbacks and execute them at proper times. */
    @VisibleForTesting
    public void executeCallbacks(ClientTransaction transaction) {
        final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
        if (callbacks == null) {
            // No callbacks to execute, return early.
            return;
        }
        log("Resolving callbacks");

        final IBinder token = transaction.getActivityToken();
        ActivityClientRecord r = mTransactionHandler.getActivityClient(token);

        final int size = callbacks.size();
        for (int i = 0; i < size; ++i) {
            final ClientTransactionItem item = callbacks.get(i);
            ......
            item.execute(mTransactionHandler, token, mPendingActions);
            item.postExecute(mTransactionHandler, token, mPendingActions);
           ......
        }
    }

    private void executeLifecycleState(ClientTransaction transaction) {
        final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();

        final IBinder token = transaction.getActivityToken();
        final ActivityClientRecord r = mTransactionHandler.getActivityClient(token);

        cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);
        // Execute the final transition with proper parameters.
        lifecycleItem.execute(mTransactionHandler, token, mPendingActions);
        lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);
    }

按照上面处理顺序,对应之前添加到clientTransaction:先处理LaunchActivityItem然后处理ResumeActivityItem。
从TransactionExecutor.executeCallbacks与executeLifecycleState可以看出都将会分两步执行Item的execute与postExecute。

  1. OnCreate
    在LaunchActivityItem.execute中创建与AMS中ActivityRecord对应的APP端的ActivityClientRecord对象,并通过AppThread.handleLaunchActivity——> performLaunchActivity: 反射生成Activity实例,.获取当前的应用的Application对象并且调用attach绑定,.最后通过Instrument调用callActivityOnCreate调用到Activity实例中的onCreate方法。

  2. onStart
    在类图中并没有生命周期中的onStart,其执行过程:
    在executeLifecycleState执行lifecycleItem.execute前,会先执行cycleToPath,该函数会在start状态 ON_CREATE和后续finish状态ON_RESUME,补充遗漏的ON_START,然后通过performLifecycleSequence——>mTransactionHandler.handleStartActivity 调用ActivityThread.handleStartActivity执行Fragment的onStart以及通过Instrument调用onStart方法

  3. onResume
    ResumeActivityItem作为lifecycleItem.execute,由ActivityThread.handleResumeActivity——>performResumeActivity,完成用Activity的onResume调用

lifecycleItem.postExecute则完成对AMS中的ActivityRecord中状态设置为resume状态,把对应的windowManager设置成resume完成状态

  1. onPause
    类似于onResume的执行过程,其也是由PauseActivityItem 来完成对Activity.onPause的调用以及对AMS中ActivityRecord的状态设置

  2. onStop
    onStop是StopActivityItem来执行,但其StopActivityItem被执行者是在PauseActivityItem.postExecute中回调到AMS中的activityPaused,当执行完pause方法之后会执行completePauseLocked方法,其中会判断当前ActivityRecord已经绑定了App端的数据,说明已经启动了,并且当前的ActivityRecord的visible为false,或者点击了锁屏使其睡眠,都会调用ActivityStatck.addToStopping——> mStackSupervisor.scheduleIdleLocked() 通过向ActivityStackSupervisorHandler发送IDLE_NOW_MSG消息在其ActivityStackSupervisorHandler.handlemessage中处理IDLE消息调用activityIdleInternal——>ActivityStatck.stopActivityLocked,并在其中执行StopActivityItem事务。
    StopActivityItem的执行类似其他几个Item。

6、onDestroy
在onStop启动过程中的activityIdleInternal在调用ActivityStatck.stopActivityLocked后,其还会调用stack.destroyActivityLocked,该函数中会启动执行DestroyActivityItem事务。

总结:

Activity的生命周期都是通过事务管理来执行,除了onStart,其他几个生命周期都对应一个ClientTransactionItem,包含execute和postExecute,其中execute要是通过IBinde与ActivityThread交互执行APP端周期的流程,而postExecute主要是更新AMS端的状态。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容