不重要的笔记

Activity生命周期流程简单记录

2017-05-23  本文已影响331人  草貌路飞

说到Activity生命周期是不是觉得很简单,在各个生命周期方法中打下log不就知道执行的流程了。但是还是想知道这些生命周期方法是在哪儿,被谁调用的。So...<br />
这里我们接着上篇文章Activity启动过程简单记录写,因为里面记录了从startActivity开始,AMS首先会执行当前正在显示的Activity的pause流程,然后创建应用进程直到调用应用进程ApplicationThread的scheduleLaunchActivity执行真正的Activity的创建和显示。所以这里就从scheduleLaunchActivity方法开始记录整个流程。<br />
--数字 代表当前方法调用下一方法的代码行号

IActivityManager am = ActivityManagerNative.getDefault();
if (a.activity != null && !a.activity.mFinished) {
am.activityIdle(a.token, a.createdConfig, stopProfiling);
}
可以看出,这里会告诉AMS activity已经空闲(?我的理解就是activity对应的decor已经添加到WMS中并且已经展示出来)了。

* `到这应用进程启动activity就算完成了。接着看AMS的后续处理。`
* `ActivityManagerService.activityIdle() --6683`
    * `ActivityStackSupervisor.activityIdleInternalLocked()`
        * ```
找到处理stopping状态的activity执行stop操作
final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
        int NS = stops != null ? stops.size() : 0;
for (int i = 0; i < NS; i++) {
            r = stops.get(i);
            final ActivityStack stack = r.task.stack;
            if (stack != null) {
                if (r.finishing) {
                    stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
                } else {
                    stack.stopActivityLocked(r);
                }
            }
        }
          ```
        * `这里只是普通的跳转,不会执行finish.
ActivityStack.stopActivityLocked() --3291`
            * `这里会判断要执行stop操作的activity有木有FLAG_ACTIVITY_NO_HISTORY的flag,如果有执行finish流程。这里不走。`
            * `ApplicationThread.scheduleStopActivity()
到这里AMS又通过binder调用要执行stop操作的activity所在进程(可能是刚才启动的activity的进程也可能不是)。`

* `回到应用进程ActivityThread中的ApplicationThread。
ApplicationThread.scheduleStopActivity()`
    * `ActivityThread.handleStopActivity()`
        * `ActivityThread.performStopActivityInner()`
            * `Activity.performStop()`
                * `Instrumentation.callActivityOnStop()`
                    * `Activity.onStop()`
    * ```
执行完onStop后回到handleStopActivity.
这里会post一个StopInfo的Runnable对象,用于通知AMS,activity已经stop完成。
StopInfo info = new StopInfo();
 info.activity = r;
 info.state = r.state;
 info.persistentState = r.persistentState;
 mH.post(info);
    *  `ActivityManagerNative.getDefault().activityStopped()`
        * `ActivityManagerService.activityStopped()`
            * `ActivityStack.activityStoppedLocked()`
                * `OVER`

为了走通onFinish生命周期方法,这里我们模拟在刚刚启动的activity上执行返回操作,其实也就是调用finish方法

Activity.finishActivity(){
    ActivityManagerNative.getDefault().finishActivity();
}

找到处理stopping状态的activity执行stop操作
final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
int NS = stops != null ? stops.size() : 0;
for (int i = 0; i < NS; i++) {
r = stops.get(i);
final ActivityStack stack = r.task.stack;
if (stack != null) {
if (r.finishing) {
stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
} else {
stack.stopActivityLocked(r);
}
}
}
```
* 这里因为是finishing状态,所以执行的是finishCurrentActivityLocked.还要注意这会传过去的mode参数为FINISH_IMMEDIATELY(立刻finish)。 ActivityStack.finishCurrentActivityLocked() --3597
* ActivityStack.destroyActivityLocked() --4020
* ApplicationThread.scheduleDestroyActivity()

总结:感觉写了挺久的,但是回头看才这么点东西。。。而且大多都是代码。。。唉唉唉
上一篇下一篇

猜你喜欢

热点阅读