Activtiy完全解析(一、Activity的创建过程)(6)

2019-02-16 00:03

if (false) {

Looper.myLooper().setMessageLogging(new

LogPrinter(Log.DEBUG, \ } ...

//进入消息循环 Looper.loop();

throw new RuntimeException(\ }

private void attach(boolean system) { sCurrentActivityThread = this; mSystemThread = system; if (!system) { ... /*

* ActivityManagerNative.getDefault()方法返回的是一个ActivityManagerProxy对象,

* ActivityManagerProxy实现了IActivityManager接口,并维护了一个mRemote,

* 这个mRemote就是ActivityManagerService的远程代理对象 */

final IActivityManager mgr = ActivityManagerNative.getDefault(); try {

//调用attachApplication(),并将mAppThread传入,mAppThread是ApplicationThread类的示例,他的作用是用来进程间通 信的

mgr.attachApplication(mAppThread); } catch (RemoteException ex) { // Ignore } ... } else { ... } ... } }

ActivityThread是应用程序进程中的主线程,他的作用是调度和执行activities、广播和其他操作。 main方法开启了消息循环机制,并调用

attach()方法,attach()方法会调用ActivityManagerNative.getDefault()获取到一个ActivityManagerProxy示例,上面step3中我们讲解了

ActivityManagerNative这个类,ActivityManagerProxy中维护了ActivityManagerService的远程代理对象mRemote; 然后会调用

attachApplication()方法通过mRemote调用到ActivityManagerService的attachApplication()中, 传入的mAppThread是ApplicationThread类

型,mAppThread实际上通过Handler实现ActivityManagerService与ActivityThread的消息通信。

step14: ActivityManagerProxy.attachApplication() (ActivityManagerNative内部类)

public void attachApplication(IApplicationThread app) throws RemoteException {

Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain();

data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(app.asBinder());

mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); }

attachApplication()接受IApplicationThread实例,step13中attach()方法传入的ApplicationThread实现了IApplicationThread,然后通过

ActivityManagerService的远程代理对象mRemote,进入ActivityManagerService的attachApplication():

step15: ActivityManagerService.attachApplication()

@Override

public final void attachApplication(IApplicationThread thread) { synchronized (this) {

int callingPid = Binder.getCallingPid();

final long origId = Binder.clearCallingIdentity();

//接着调用attachAppwww.shanxiwang.netlicationLocked() attachApplicationLocked(thread, callingPid); Binder.restoreCallingIdentity(origId); } }

private final boolean attachApplicationLocked(IApplicationThread thread, int pid) { //① 获取到进程 ProcessRecord app;

if (pid != MY_PID && pid >= 0) { synchronized (mPidsSelfLocked) { app = mPidsSelfLocked.get(pid); } } else {

app = null; }

if (app == null) {

if (pid > 0 && pid != MY_PID) { ...

Process.killProcessQuiet(pid); } else {

thread.scheduleExit(); ... }

return false; } ...

//② 对app的一些成员变量进行初始化 app.makeActive(thread, mProcessStats); app.curAdj = app.setAdj = -100;

app.curSchedGroup = app.setSchedGroup = Process.THREAD_GROUP_DEFAULT; app.forcingToForeground = null;

updateProcessForegroundLocked(app, false, false); app.hasShownUi = false; app.debugging = false; app.cached = false;

app.killedByAm = false;

...

boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); ...

boolean badApp = false;

boolean didSomething = false;

// See if the top visible activity is waiting to run in this process... /*

* ③ 检查当前进程中顶端的activity是否等着被运行,这个顶端的activity就是我们要启动的activity; *

* 此处适用于需要为activity创建新进程的情况(比如点击Launcher桌面上的图标启动应用,或者打开配置了process的activity) *

* 如果应用程序已经启动,在应用程序内部启动activity(未配置process)不会创建进程,这种情况回到step11中的第①步直接开启

activity */

if (normalMode) { try {

if (mStackSupervisor.attachApplicationLocked(app)) { didSomething = true; }

} catch (Exception e) {

Slog.wtf(TAG, \ badApp = true; } }

// Find any services that should be running in this process... //④ 查找当前进程中应该启动的服务,并将其启动 if (!badApp) { try {

didSomething |= mServices.attachApplicationLocked(app, processName); } catch (Exception e) {

Slog.wtf(TAG, \ badApp = true; } }

// Check if a next-broadcast receiver is in this process... //⑤ 查找当前进程中应该注册的广播

if (!badApp && isPendingBroadcastProcessLocked(pid)) { try {

didSomething |= sendPendingBroadcastsLocked(app); } catch (Exception e) {

// If the app died trying to launch the receiver we declare it 'bad'

Slog.wtf(TAG, \ badApp = true; } }

// Check whether the next backup agent is in this process... ...

return true; }

attachApplication()方法调用了attachApplicationLocked()方法, 在step12中,我们创建了一个ProcessRecord,这里通过进程的pid将他取

出来,赋值给app, 并初始化app的一些成员变量,然后为当前进程启动顶层activity、一些服务和广播; 这里我们就不深入研究到底启动的是

那些,我们主要研究activity的启动,所以重点看第③步,_ step6_中最后创建了一个ActivityRecord实例r,这个r只是进程堆栈中的一个活

动记录, 然后再step8中将这个r插入到堆栈最顶端,所以这个r相当于一个占位,并不是真正启动的Activity, 真正启动Activity需要判断进

程是否存在,如果存在就直接启动,如果不存在需要启动进程后再执行此处第③步调用ActivityStackSupervisor.attachApplicationLocked

(ProcessRecord)方法:

step16: ActivityStackSupervisor.attachApplicationLocked(ProcessRecord)

boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { final String processName = app.processName; boolean didSomething = false;

for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {

ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks; for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { //遍历进程中的堆栈,找到最顶层的堆栈 final ActivityStack stack = stacks.get(stackNdx); if (!isFrontStack(stack)) { continue; } // /*

* 获取位于顶层堆栈中栈顶的activity,这个activity就是目标activity(需要被启动的);

* 这个hr就是step6中创建的ActivityRecord实例r */

ActivityRecord hr = stack.topRunningActivityLocked(null); if (hr != null) {

if (hr.app == null && app.uid == hr.info.applicationInfo.uid && processName.equals(hr.processName)) { try {

//调用realStartActivityLocked()方法启动activity,同step11中的


Activtiy完全解析(一、Activity的创建过程)(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国百事可乐行业市场调查研究报告(目录)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: