1.Activity启动流程。
动态代理,当Activity 没配置注册的情况下,绕过去(不报错)。
插件化apk,里面的Activity, 是不会在主apk里面配置的。
注册一个代理的Activity。
Activity: API-23
--> startActivity()
--> this.startActivity(intent, null)
--> startActivityForResult(intent, -1)
--> startActivityForResult(intent, requestCode, null)
--> mInstrumentation.execStartActivity()
Instrumentation:
--> execStartActivity()
--> ActivityTaskManager.getService().startActivity()- getService() // 进程间通信。
--IActivityTaskManagerSingleton.get()--
private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
new Singleton<IActivityTaskManager>() {
@Override
protected IActivityTaskManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
return IActivityTaskManager.Stub.asInterface(b);
}
};
ActivityManagerNative extends Binder // IPC通信。
ActivityTaskManager.getService().startActivity()
ActivityManagerProxy--startActivity-- mRemote.transact(START_ACTIVITY_TRANSACTION, data,reply,0) // 调用服务端的方法
ActivityManagerNative 服务端:: onTransact-> case START_ACTIVITY_TRANSACTION
-- int result = startActivity()
ActivityManagerService extends ActivityManagerNative
IActivityManager extends IInterface // 接口声明。Hook点,hook里面的接口方法。动态代理。 ActivityTaskManager.getService().startActivity()
然后把方法startActivity的intent 修改了。让他过系统的检查(一个代理临时的 已经注册了的activity)。
handleLaunchActivity, 创建把Activity换回来。
这样做到插件化开发的第一步。
ActivityManagerNative extends Binder implements IActivityManager
ActivityManagerService:
--> startActivity()
--> startActivityAsUser()
--> mStackSupervisor.startActivityMayWait()
ActivityStackSupervisor: 栈的管理
--> startActivityMayWait()
ActivityInfo aInfo = resolveActivity();
ResolveInfo info = AppGlobals.getPackageManager().resolveIntent()
PackageManagerService: extends IPackageManager.Stub
--> resolveIntent()
--> queryIntentActivities()
--> chooseBestActivities()
ActivityStackSupervisor:
--> startActivityLocked()
insertTaskAtTop()-- task.addActivityToTop(r)
mStackSupervisor.resumeTopActivitiesLocked()
--> ActivityRecord r = new ActivityRecord();
--> startActivityUncheckedLocked();
launchSingleTop/ launchSingleInstance/ launchSingleTask
ActivityStack.logStartActivity()
top.deliverNewIntentLocked()
ActivityStack:
startPausingLocked()
prev.app.thread.schedulePauseActivity()
ApplicationThread:
sendMessage(H.PAUSE_ACTIVITY)
handlePausingActivity()
performPauseActivity()
performPauseActivity()
mInstrumentation.callActivityOnPause(r.activity)
Instrumentation:
callActivityOnPause()
activity.performPause()
onPause()
mResumed = false;
总结:A-> B
先解析Activity,做一些错误的校验(是否在Manifest注册,ComponentName是否有...);
启动模式处理(singleTop,SingleTask...);
调用A的 onPause()方法。
singleTop:
ActivityStack.logStartActivity()
intentActivity.deliverNewIntentLocked()
app.thread.scheduleNewIntent(ar, appToken)
2.B页面的生命周期函数。onResume
performPauseActivity(token, finished, r.isPreHoneycomb())
-- ActivityManagerNative.getDefault().activityPaused(token);
ActivityManagerService:
-- activityPaused()
stack.activityPausedLocked(token, false); // stack是 ActivityStack类。
completePauseLocked(true) // 代表A已经执行了onPause方法。
finishCurrentActivityLocked()
mStackSupervisor.resumeFocusedStackTopActivityLocked()
ActivityStackSupervisor:
resumeTopActivityLocked()
result = resumeTopActivityInnerLocked(prev, options);
mStackSupervisor.startSpecificActivityLocked()
realStartActivityLocked()
app.thread.scheduleLaunchActivity() // 去启动activity
ApplicationThread:
scheduleLaunchActivity()
sendMessage(H.LAUNCH_ACTIVITY, r)
handleLaunchActivity(r, null)
Activity a = performLaunchActivity(r, customIntent) // 创建B Activity
activity = mInstrumentation.newActivity()
mInstrumentation.callActivityOnCreate() // 执行onCreate生命周期方法。
prePerformCreate()
activity.performCreate()--> onCreate(icicle)
postPerformCreate()
return (Activity)cl.loadClass(className).newInstance() // 反射创建Activity实例
Context appContext = createBaseContextForActivity(r,activity) // 创建context
activity.attach() // 把上下文等放进去。
activity.callActivityOnCreate()
handleResumeActivity()
performResumeActivity()
r.activity.performResume()
performRestart()
mInstrumentation.callActivityOnRestart(this)
performStart();
mInstrumentation.callActivityOnStart(this)-- activity.onStart()
mInstrumentation.callActivityOnResume(this); // 执行onResume
流程总结:A-> B
- 先解析Activity,做一些错误的校验,启动模式判断(SingleTop, singleTask), 调用A的onPause方法。
- B利用反射创建activity实例,创建Context, attach数据, onCreate()、 onStart()、onResume()
网友评论