Activity启动流程(3)

Activity启动流程(2)中详述了从Launcher启动一个应用时,ActivityManangerService进程的第一部分逻辑,这部分逻辑的主要工作总结起来就是解析即将启动的Activty信息,设置Activity Task,设置Launcher的UI逻辑,为即将启动的Activity做准备。本篇的主要内容是理解Launcher的pause过程。

ctivity启动流程(2),Activity的启动流程已经进入到了pause Launcher的流程,这部分的实现在frameworks/base/core/java/android/app/ApplicationThreadNative.java中

public final void schedulePauseActivity(IBinder token, boolean finished,
        boolean userLeaving, int configChanges) throws RemoteException {
    Parcel data = Parcel.obtain();
    data.writeInterfaceToken(IApplicationThread.descriptor);
    data.writeStrongBinder(token);
    data.writeInt(finished ? 1 : 0);
    data.writeInt(userLeaving ? 1 :0);
    data.writeInt(configChanges);
    mRemote.transact(SCHEDULE_PAUSE_ACTIVITY_TRANSACTION, data, null,
            IBinder.FLAG_ONEWAY);
    data.recycle();
}

这段代码进行了binder的夸进程通信,会调用Launcher所在进程的ApplicationThread类的schedulePauseActivity方法。ApplicationThread是ActivityThread的内部类,ActivityThread的代码位于frameworks/base/core/java/android/app/ActivityThread.java。

public final void schedulePauseActivity(IBinder token, boolean finished,
            boolean userLeaving, int configChanges) {
        queueOrSendMessage(
                finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
                token,
                (userLeaving ? 1 : 0),
                configChanges);
    }  

就喜欢这种简短的代码!!token指向的是Launcher的ActivityRecord,finished = false,故queueOrSendMessage()的第一个参数是H.PAUSE_ACTIVITY,研究下queueOrSendMessage()函数

private void queueOrSendMessage(int what, Object obj, int arg1, int arg2) {
    synchronized (this) {
        if (DEBUG_MESSAGES) Slog.v(
            TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
            + ": " + arg1 + " / " + obj);
        Message msg = Message.obtain();
        msg.what = what;
        msg.obj = obj;
        msg.arg1 = arg1;
        msg.arg2 = arg2;
        mH.sendMessage(msg);
    }
}  

这段代码没什么干活,直接看mH对消息的处理吧

    private void handlePauseActivity(IBinder token, boolean finished,
        boolean userLeaving, int configChanges) {
    ActivityClientRecord r = mActivities.get(token);
    if (r != null) {
        //Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r);
        if (userLeaving) {
            performUserLeavingActivity(r);
        }

        r.activity.mConfigChangeFlags |= configChanges;
        performPauseActivity(token, finished, r.isPreHoneycomb());

        // Make sure any pending writes are now committed.
        if (r.isPreHoneycomb()) {
            QueuedWork.waitToFinish();
        }

        // Tell the activity manager we have paused.
        try {
            //代码块1
          ActivityManagerNative.getDefault().activityPaused(token);
        } catch (RemoteException ex) {
        }
    } 

ee代码的逻辑已经相当简洁了,就是执行了Launcher的onPause函数,然后调用代码块1的方法告诉ActivityManangerService,Launcher已经执行完onPause方法,ActivityManangerService可以继续执行启动目标Activity的其他操作了。

本节的内容相对比较少,下篇的将会分析Launcher 在执行完onPause之后,ActivityManangerService执行的操作。我们离目标Activity的onCreate方法又近了一步!!!!!!

猜你喜欢

转载自blog.csdn.net/rockstore/article/details/79797460