之前的博客分析过了,启动一个新的Activity。会把之前的Activity pause。会在ActivityThread中调用AMS的activityPaused函数。下面就是AMS的activityPaused函数。
@Override
public final void activityPaused(IBinder token) {
final long origId = Binder.clearCallingIdentity();
synchronized(this) {
ActivityStack stack = ActivityRecord.getStackLocked(token);
if (stack != null) {
stack.activityPausedLocked(token, false);
}
}
Binder.restoreCallingIdentity(origId);
}
而在AMS的activityPaused函数会调用ActivityStack的activityPausedLocked函数。我们就在这个函数中获取要kill进程的包名,然后调用AMS的forceStopPackage函数来kill 进程。
final void activityPausedLocked(IBinder token, boolean timeout) {
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE,
"Activity paused: token=" + token + ", timeout=" + timeout);
final ActivityRecord r = isInStackLocked(token);
if (r != null) {
mHandler.removeMessages(PAUSE_TIMEOUT_MSG, r);
if (mPausingActivity == r) {
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSED: " + r
+ (timeout ? " (due to timeout)" : " (pause complete)"));
String pkgName = r.packageName;//获取包名
mService.forceStopPackage(pkgName, UserHandle.myUserId()); //kill进程
completePauseLocked(true);
} else {
EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
r.userId, System.identityHashCode(r), r.shortComponentName,
mPausingActivity != null
? mPausingActivity.shortComponentName : "(none)");
if (r.finishing && r.state == ActivityState.PAUSING) {
if (DEBUG_PAUSE) Slog.v(TAG,
"Executing finish of failed to pause activity: " + r);
finishCurrentActivityLocked(r, FINISH_AFTER_VISIBLE, false);
}
}
}
本文分析了Android系统中Activity暂停的过程,详细介绍了如何通过ActivityStack的activityPausedLocked函数获取要终止的进程包名,并调用forceStopPackage函数实现进程的终止。

5809

被折叠的 条评论
为什么被折叠?



