Android Activity原理分析 联系客服

发布时间 : 星期六 文章Android Activity原理分析更新完毕开始阅读de01183543323968011c92f9

performStopActivityInner(ActivityRecord r, StopInfo info, boolean keepShown)ActivityThread.java if (r != null)if (!keepShown)r.paused = truer.activity.performStop r.stopped = true

基本上没什么好说的,就是从activityThread层传到Activity层; performStop if (!mStopped)mResumed = false if (mWindow != null)mCalled = falsemInstrumentation.callActivityOnStop(this)mStopped = truemWindow.closeAllPanelsactivity.onStop这个函数会被重载

这里我们终于看到了,我们想看的onStop的调用了;

CloseAllPanel就是关闭那些菜单或者对话框,panel这里我的理解是那些类似菜单的UI,或者像

dialog这样的UI,如果要更详细的信息,需要看PhoneWindow.java这个文件;

OK,至此整个暂停到停止的过程就结束了;

5.2.4

OnResume的调用

现在要看看这个resume的流程了;

前面我们已经看到过这个函数了resumeTopActivityLocked;

?Tech, 2010-2-5 Page 33 of 38

resumeTopActivityLocked(HistoryRecord prev)onResume的路径 HistoryRecord next = topRunningActivityLocked(null)if (next == null) if (next.app != null && next.app.thread != null) return startHomeActivityLocked启动launchermWindowManager.setAppVisibility(next, true)mResumedActivity = nextnext.app.thread.scheduleResumeActivity(next,isNextTransitionForward())setAppVisibility(IBinder token, boolean visible) WindowManagerService.javamRemote.transact(SCHEDULE_RESUME_ACTIVITY_TRANSACTION, data, null,IBinder.FLAG_ONEWAY)当时,我们的那个场景,最右边的那个判断语句不为真,因为刚开始的时候next.app等肯定是为空的,当resume的时候,这个app就不为null了,所以会触发下面的逻辑; 先是通过setAppVisiblity函数触发一个显示的流程,注意这里只是放一个消息到消息队列里面,所以显示的真正完成并不是同步的; 接着设置mResumeActivity=next,也就是说即将要显示的activity都会被放到这个mResumeActivity对象里; 最后通过next.app.thread.scheduleResumeActivity来触发resume的整个过程;

onTransact(int code, Parcel data, Parcel reply, int flags) case SCHEDULE_RESUME_ACTIVITY_TRANSACTIONscheduleResumeActivity(b, isForward)ApplicationThreadNative.javascheduleResumeActivity(IBinder token, boolean isForward)queueOrSendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0) 这个函数真如我们前面说的,依然只是放一个消息进去而已; 处理函数逻辑如下:

?Tech, 2010-2-5 Page 34 of 38

handleMessageActivityThread.javacase RESUME_ACTIVITY

handleResumeActivity((IBinder)msg.obj, true,msg.arg1 != 0)这里就是分发消息而已,接着看:

handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) ActivityThread.java ActivityRecord r = performResumeActivity(token, clearHide)ActivityThread.javar.activity.performResume

这里层层调用后,看到了我们已经讨论过的函数performResume;

这里的整个逻辑在第一次启动一个activity的时候也会走,只是进入到performResume的时候执行的逻辑不一样; 去除掉一些不关心的逻辑,大约就是这样:

performResumeResume的路径Activity.java

?Tech, 2010-2-5 Page 35 of 38

performResumeResume的路径Activity.javaperformRestartmInstrumentation.callActivityOnResume(this)调用callActivityOnResume(Activity activity) if (mStopped)mInstrumentation.callActivityOnRestart(this)performStart这里触发onStart的调用callActivityOnRestart(Activity activity)Instrumentation.javamInstrumentation.callActivityOnStart(this)activity.onResumeactivity.onRestartallActivityOnStart(Activity activity)onResume这个函数通常会被重载onRestart这个函数通常会被重载的activity.onStart通常这个函数会被重新实现Activity.javamCalled = true当重新实现后,记得调用这个父类的同名函数,否则会抛出异常mCalled = true这个父类的实现是必须要调用的mCalled = true

行;

我们上次看到的逻辑是最右边的分支;

现在我们的情况满足左边的条件,也就是mStoped为true,将会触发onRestart和onStart的执

至此,我们的resume的路径也走完了;

6. 总结

需要总结一下,

?Tech, 2010-2-5 Page 36 of 38