App启动流程:相关问题整理
2019-04-21 本文已影响6人
sjandroid
问题1:App进程是如何获取system_server进程中提供的系统服务的?(ActivityManager.getService()是如何获取AMS在App进程的Binder代理的)?
1.Android需要使用Binder这种IPC方式来使用system_server进程中提供的那些系统服务。
2.App进程启动完毕后,会执行ApplicationThread.bindApplication()。在该方法内部会执行ServiceManager.initServiceCache()用于缓存系统服务在App进程的 Binder本地代理对象。
3.通过ActivityManager.getService()会从ServiceManager的缓存池中获取AMS服务在App进程中的Binder代理对象。
问题2:为什么要把新创建的ActivityStack指向ASS中的mFocusedStack?
1:这是因为在后续调用“ActivityStack.resumeTopActivityInnerLocked()”时会先暂停“非焦点”Activity栈中保存的已经处于栈顶的Activity,然后再恢复处于焦点栈中待启动的Activity。
2:这里具体通过“ASS.isFocusedStack()”来判断“当前 Activity 栈是否是焦点栈”。而在该方法中就是判断相应栈是否是ASS.mFocusedStack指向的那个栈。
源码
boolean isFocusedStack(ActivityStack stack) {
if (stack == null) {
return false;
}
final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
if (parent != null) {
stack = parent.getStack();
}
//判断是否是“mFocusedStack指向的栈”。
return stack == mFocusedStack;
}