Android Activity原理分析 联系客服

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

resumeTopActivityLocked(HistoryRecord prev) 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.java

最开始需要找出下一个需要显示的activity,代码如下:

private final HistoryRecord topRunningActivityLocked(HistoryRecord notTop) { int i = mHistory.size()-1; while (i >= 0) {

HistoryRecord r = (HistoryRecord)mHistory.get(i); if (!r.finishing && r != notTop) { return r; } i--; }

return null; }

可以看到这里是从后面开始往前找的,所以肯定会找到我们在上面加入的那个HistoryRecord,它的匹配条件为没有finish,也不等于传入的这个记录,finish的意思就可以简单理解为将会被destory,后面会讲;

这个函数topRunningActivityLocked返回后,如果没有找到合适的记录,那么就会启动Home Activity; 最右边这路是和我们密切相关的,它判断这个新选出来的记录的app以及app的thread是否为空,简单说就是判断这个task对应的进程是否存在,新创建的记录,肯定为空的,所以不会走到这个分支, 但是后面我们会再来看这个函数,它其实是我们需要分析的resume的路径,后面再讲; 我们重点看看这个else的逻辑;

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

resumeTopActivityLocked(HistoryRecord prev)Else第一次应该走这条路线startSpecificActivityLocked(next, true, true)startProcessLocked(r.processName, r.info.applicationInfo, true, 0, \这里估计才是第一次走的路线,请看activity生命周期页这个路径看下来很简单,就是通过startSpecificActivityLocked(next, true, true)调用

startProcessLocked(r.processName, r.info.applicationInfo, true, 0,\\完成进程的启动; 我们看看后面的逻辑;

startProcessLocked(r.processName, r.info.applicationInfo, true, 0, \r.intent.getComponent(), false)这里估计才是第一次走的路线

startProcessLocked(String processName,ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting)ProcessRecord app = getProcessRecordLocked(processName, info.uid) if (app == null)startProcessLocked(app, hostingType, hostingNameStr) app = newProcessRecordLocked(null, info, processName)startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr)mProcessNames.put(processName, info.uid, app)pid = Process.start(\android.app.ActivityThread\mSimpleProcessManagement ? app.processName : null, uid, uid,gids, debugFlags, null)我略去了一些无关的信息,可以看到这里创建的进程的名字是android.app.ActivityThread; 另外关于此进程的所有信息都保存在app这个变量里面,而app和这个进程的联系时依靠这个进程创建返回来的pid来联系的;

而我们所关心的那个进程也就是我们要启动的这个activity所属的那个进程在新的一片天地里面遨游了;

?Tech, 2010-2-5

Page 14 of 38

5.1.3 新的activity的进程逻辑

上一节,我们创建了一个进程,它的实体其实是ActivityThread.java,我们看看它是怎么运行的;

main(String[] args)ActivityThread.javaActivityThread thread = new ActivityThreadthread.attach(false)attach(boolean system) if (!system) IActivityManager mgr = ActivityManagerNative.getDefaultmgr.attachApplication(mAppThread)attachApplication(IApplicationThread app) mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0)ActivityManagerNative.java这里最关键的就是这个attach,我们看下去就发现,这个attach又要经过Binder调用进入到别处了,要想知道这个attach做什么什么小动作,必须得跟进去看看; 注意下面的这些逻辑又要进入到下一个进程里面了;

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

onTransactcase ATTACH_APPLICATION_TRANSACTION:IApplicationThread app = ApplicationThreadNative.asInterface(data.readStrongBinder()) if (app != null)attachApplication(app)ActivityManagerService.javaattachApplication(IApplicationThread thread)ActivityManagerService.javaattachApplicationLocked(thread, callingPid)attachApplicationLocked(IApplicationThread thread, int pid)看下来发现正事都没干,就走了一堆流程,还得继续分析:

attachApplicationLocked(IApplicationThread thread, int pid)HistoryRecord hr = topRunningActivity if (hr != null) Locked(null) if (hr.app == null && app.info.uid == hr.info.applicationInfo.uid && processName.equals(hr.processName))realStartActivityLocked(hr, app, true, true) ?Tech, 2010-2-5 Page 16 of 38