Activity启动流程(2)中详述了从Launcher启动一个应用时,ActivityManangerService进程的第一部分逻辑,这部分逻辑的主要工作总结起来就是解析即将启动的Activty信息,设置Activity Task,设置Launcher的UI逻辑,为即将启动的Activity做准备。本篇的主要内容是理解Launcher的pause过程。
在ctivity启动流程(2),Activity的启动流程已经进入到了pause Launcher的流程,这部分的实现在frameworks/base/core/java/android/app/ApplicationThreadNative.java中
public final void schedulePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
data.writeStrongBinder(token);
data.writeInt(finished ? 1 : 0);
data.writeInt(userLeaving ? 1 :0);
data.writeInt(configChanges);
mRemote.transact(SCHEDULE_PAUSE_ACTIVITY_TRANSACTION, data, null,
IBinder.FLAG_ONEWAY);
data.recycle();
}
这段代码进行了binder的夸进程通信,会调用Launcher所在进程的ApplicationThread类的schedulePauseActivity方法。ApplicationThread是ActivityThread的内部类,ActivityThread的代码位于frameworks/base/core/java/android/app/ActivityThread.java。
public final void schedulePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges) {
queueOrSendMessage(
finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
token,
(userLeaving ? 1 : 0),
configChanges);
}
就喜欢这种简短的代码!!token指向的是Launcher的ActivityRecord,finished = false,故queueOrSendMessage()
的第一个参数是H.PAUSE_ACTIVITY,研究下queueOrSendMessage()
函数
private void queueOrSendMessage(int what, Object obj, int arg1, int arg2) {
synchronized (this) {
if (DEBUG_MESSAGES) Slog.v(
TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
+ ": " + arg1 + " / " + obj);
Message msg = Message.obtain();
msg.what = what;
msg.obj = obj;
msg.arg1 = arg1;
msg.arg2 = arg2;
mH.sendMessage(msg);
}
}
这段代码没什么干活,直接看mH
对消息的处理吧
private void handlePauseActivity(IBinder token, boolean finished,
boolean userLeaving, int configChanges) {
ActivityClientRecord r = mActivities.get(token);
if (r != null) {
//Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r);
if (userLeaving) {
performUserLeavingActivity(r);
}
r.activity.mConfigChangeFlags |= configChanges;
performPauseActivity(token, finished, r.isPreHoneycomb());
// Make sure any pending writes are now committed.
if (r.isPreHoneycomb()) {
QueuedWork.waitToFinish();
}
// Tell the activity manager we have paused.
try {
//代码块1
ActivityManagerNative.getDefault().activityPaused(token);
} catch (RemoteException ex) {
}
}
ee代码的逻辑已经相当简洁了,就是执行了Launcher的onPause函数,然后调用代码块1的方法告诉ActivityManangerService,Launcher已经执行完onPause方法,ActivityManangerService可以继续执行启动目标Activity的其他操作了。
本节的内容相对比较少,下篇的将会分析Launcher 在执行完onPause之后,ActivityManangerService执行的操作。我们离目标Activity的onCreate方法又近了一步!!!!!!