android启动流程分析(二)
来源:互联网 发布:鲁迅文学院网络班 编辑:程序博客网 时间:2024/05/16 11:12
上一篇介绍了apk启动的流程到了创建activity的创建这里接着继续分析,先上图片
看高清图请下载
这里从handleLaunchActivity方法继续分析,如不明白的可以参考上一篇的分析android启动流程分析,这边直接就上代码了
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) { ...... Activity a = performLaunchActivity(r, customIntent);//创建activity if (a != null) { r.createdConfig = new Configuration(mConfiguration); reportSizeConfigurations(r); Bundle oldState = r.state; handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason); ...... } else { ...... } }
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) { ...... Activity activity = null; try { java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); activity = mInstrumentation.newActivity( cl, component.getClassName(), r.intent);//通过Instrumentation这个类创建Activity ...... } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to instantiate activity " + component + ": " + e.toString(), e); } } ...... activity.attach(appContext, this, getInstrumentation(), r.token,//attach方法 r.ident, app, r.intent, r.activityInfo, title, r.parent, r.embeddedID, r.lastNonConfigurationInstances, config, r.referrer, r.voiceInteractor, window); ...... int theme = r.activityInfo.getThemeResource();//设置主题 if (theme != 0) { activity.setTheme(theme); } ...... if (r.isPersistable()) {//根据本地是否持久化来判断走那个方法,(这个持久化个人理解是activity被不正常销毁造成的) //这个方法调用的是activity的oncreate方法 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnCreate(activity, r.state); }...... if (!r.activity.mFinished) { activity.performStart();//调用activity的onstart方法 r.stopped = false; } ...... if (!r.activity.mFinished) { if (r.isPersistable()) { if (r.state != null || r.persistentState != null) { mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state, r.persistentState); } } else if (r.state != null) {//r.state是AMS传过来的,也就是说OnRestoreInstanceState的调用取决于AMS是否想恢复activity。 mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state); } } if (!r.activity.mFinished) { activity.mCalled = false; if (r.isPersistable()) { mInstrumentation.callActivityOnPostCreate(activity, r.state, r.persistentState); } else { mInstrumentation.callActivityOnPostCreate(activity, r.state); } if (!activity.mCalled) { throw new SuperNotCalledException( "Activity " + r.intent.getComponent().toShortString() + " did not call through to super.onPostCreate()"); } } } r.paused = true; mActivities.put(r.token, r); } catch (SuperNotCalledException e) { throw e; } catch (Exception e) { if (!mInstrumentation.onException(activity, e)) { throw new RuntimeException( "Unable to start activity " + component + ": " + e.toString(), e); } } return activity; }
通过上面的代码可以看到activity再启动的时候首选调用attach--->oncreate--->onStart--->onPostCreate
对于attach是activity的一些初始化配置,在这个方法中会创建PhoneWindow对象,对于onPostCreate方法是Activity完全起来之后调用的方法(官方解释Called when activity start-up is complete (after onStart() and onRestoreInstanceState(Bundle) have been called),对于这个方法目前不知道有什么特殊的用法如有特殊用法,希望能提出。其他的两个方法这里就不多说了我们常用的方法。上面还有个不是生命周期的一部分的是onRestoreInstanceState这个方法的调用是在AMS判定需要调用的时候才会调用(转屏,activity不正常被系统回收等)
final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) { ...... // TODO Push resumeArgs into the activity for consideration r = performResumeActivity(token, clearHide, reason); ..... if (a.mVisibleFromClient && !a.mWindowAdded) {//将decor添加到Window上 a.mWindowAdded = true; wm.addView(decor, l); } .... }
public final ActivityClientRecord performResumeActivity(IBinder token, boolean clearHide, String reason) { ...... try { r.activity.onStateNotSaved(); r.activity.mFragments.noteStateNotSaved(); if (r.pendingIntents != null) { deliverNewIntents(r, r.pendingIntents); r.pendingIntents = null; } if (r.pendingResults != null) { deliverResults(r, r.pendingResults); r.pendingResults = null; } r.activity.performResume();...... } return r; }
final void performResume() { performRestart();..... mInstrumentation.callActivityOnResume(this);//调用了onResume方法 if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onResume()"); } ...... mFragments.dispatchResume(); mFragments.execPendingActions(); onPostResume();// if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onPostResume()"); } }
final void performRestart() { mFragments.noteStateNotSaved(); if (mToken != null && mParent == null) { // No need to check mStopped, the roots will check if they were actually stopped. WindowManagerGlobal.getInstance().setStoppedState(mToken, false /* stopped */); } if (mStopped) {//当时从stop状态恢复的时候走下面的代码 mStopped = false; synchronized (mManagedCursors) { final int N = mManagedCursors.size(); for (int i=0; i<N; i++) { ManagedCursor mc = mManagedCursors.get(i); if (mc.mReleased || mc.mUpdated) { if (!mc.mCursor.requery()) { if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { throw new IllegalStateException( "trying to requery an already closed cursor " + mc.mCursor); } } mc.mReleased = false; mc.mUpdated = false; } } } mCalled = false; mInstrumentation.callActivityOnRestart(this); if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onRestart()"); } performStart(); } }通过上面的方法可以找到activity接下来正常的运行声明周期应该是-onResure---->onPostResure,但是如果要是从stop状态下回复Activity的时候就会先调用onRestart--->onstart-->onResure--->onPostResure
到这里activity就算启动完成了,显现出来了,上面的代码分析是Activity启动的声明周期,下一篇分析Activity关闭的生命周期
阅读全文
0 0
- android启动流程分析(二)
- android TV架构启动流程分析(二)
- Android Framework启动流程分析(二)
- Android启动流程分析(二) init进程的启动
- Linux内核启动流程分析(二)
- Activity启动流程分析(二)
- Android启动流程二
- android启动流程分析
- Android 启动流程分析
- Android启动流程分析之二:内核的引导
- Android启动流程分析之二:内核的引导
- Activity启动流程源码分析之Launcher启动(二)
- Android之init启动流程(二)
- android应用程序的启动流程(二)
- Android SensorService启动流程(二)
- Android 启动流程分析(一)
- android启动流程分析(一)
- Android Input流程分析(一):启动
- 功能包package编译的两种方式
- angularJS 之google安装batarang
- Rocket MQ 结构体系
- VScode yapf 快捷键(Shift+Alt+F)无法使用解决 CentOS7
- MATLAB学习笔记 彩色变换
- android启动流程分析(二)
- 几个好用的Ubuntu辅助工具:FusumaUnity + Tweak Tool + Compiz
- 复制安全性
- Spring boot 手动注入bean
- Myql运行时报错: Table 'performance_schema.session_variables' doesn't exist
- Easyui combobox设置默认值
- C#读取Excel 几种方法的体会
- 动态规划-矩阵连乘问题
- 说说 JavaScript 表单脚本之基础知识