Android Activity启动流程源码全解析(2)

本文详细分析了Android Activity的启动流程,包括startPausingLocked的执行、已存在进程中的Activity如何通过scheduleResumeActivity启动,以及空Activity时如何通过startSpecificActivityLocked启动新进程并调用生命周期方法。通过源码追踪,揭示了Activity启动过程中的 Binder 通信和生命周期调用机制。
摘要由CSDN通过智能技术生成

接上之前的分析

++Android Activity启动流程源码全解析(1)++

1.正在运行的Activity调用startPausingLocked

一个一个分析,先来看看startPausingLocked

    final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, boolean resuming,
            boolean dontWait) {
   
        ......
        if (prev.app != null && prev.app.thread != null) {
   
            if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Enqueueing pending pause: " + prev);
            try {
   
                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
                        prev.userId, System.identityHashCode(prev),
                        prev.shortComponentName);
                mService.updateUsageStats(prev, false);
                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
                        userLeaving, prev.configChangeFlags, dontWait);
            } catch (Exception e) {
   
                Slog.w(TAG, "Exception thrown during pause", e);
                mPausingActivity = null;
                mLastPausedActivity = null;
                mLastNoHistoryActivity = null;
            }
        } else {
   
            mPausingActivity = null;
            mLastPausedActivity = null;
            mLastNoHistoryActivity = null;
        }  
        ......

执行Activity所在进程的schedulePauseActivity方法,prev.app.threadIApplicationThread,这又是一个Binder,真实的执行方法是在ApplicationThread中(继承自IApplicationThread的子类ApplicationThreadNative),这两个类是服务端跟客户端通信,对应客户端和服务端通信是ActivityManagerProxy和ActivityManagerService,他们都继承自ActivityManagerNative

ApplicationThreadActivityThread的私有内部类:

ApplicationThread.schedulePauseActivity

        public final void schedulePauseActivity(IBinder token, boolean finished,
                boolean userLeaving, int configChanges, boolean dontReport) {
   
            sendMessage(
                    finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
                    token,
                    (userLeaving ? 1 : 0) | (dontReport ? 2 : 0),
                    configChanges);
        }
        
        private void sendMessage(int what, Object obj, int arg1, int arg2) {
   
            sendMessage(what, obj, arg1, arg2, false);
        }
        private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
   
            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;
            if (async) {
   
                msg.setAsynchronous(true);
            }
            mH.sendMessage(msg);
        }

熟悉的handler发送消息,自然想到处理消息是在handleMessage中:

 case PAUSE_ACTIVITY:
     Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
     handlePauseActivity((IBinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2,
             (msg.arg1&2) != 0);
     maybeSnapshot();
     Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
     break;
 case PAUSE_ACTIVITY_FINISHING:
     Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
     handlePauseActivity((IBinder)msg.obj, true, (msg.arg1&1) != 0, msg.arg2,
             (msg.arg1&1) != 0);
     Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

这两个消息都是调用的

handlePauseActivity

    private void handlePauseActivity(IBinder token, boolean finished,
            boolean userLeaving, int configChanges, boolean dontReport) {
   
        ActivityClientRecord r = mActivities.get(token);
        if (r != null) {
   
            if (userLeaving) {
   
                performUserLeavingActivity(r);
            }

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

            if (r.isPreHoneycomb()) {
   
                QueuedWork.waitToFinish();
            }

            //通知activity manager已经pause
            if (!dontReport) {
   
                try {
   
                    ActivityManagerNative.getDefault().activityPaused(token);
                } catch (RemoteException ex) {
   
                }
            }
            mSomeActivitiesChanged = true;
        }
    }

来到performPauseActivity

    final Bundle performPauseActivity(IBinder token, boolean finished,
            boolean saveState) {
   
        ActivityClientRecord r = mActivities.get(token);
        return r != null ? performPauseActivity(r, finished, saveState) : null;
    }
    final Bundle performPauseActivity(ActivityClientRecord r, boolean finished,
            boolean saveState) {
   
        if (r.paused) {
   
            if (r.activity.mFinished) {
   
                //如果已经finish,直接返回
                return null;
            }
            RuntimeException e = new RuntimeException(
                    "Performing pause of activity that is not resumed: "
                    + r.intent.getComponent().toShortString());
            Slog.e(TAG, e.getMessage(), e);
        }
        if (finished) {
   
            r.activity.mFinished = true;
        }
        try {
   
            //保存状态
            if (!r.activity.mFinished && saveState) {
   
                callCallActivityOnSaveInstanceState(r);
            }
            r.activity.mCalled = false;
            //交给Instrumentation处理
            mInstrumentation.callActivityOnPause(r.activity);
            EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(),
                    r.activity.getComponentName().getClassName());
            
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值