Activity暂停时kill进程

来源:互联网 发布:淘宝网首页 编辑:程序博客网 时间:2024/06/02 02:27

之前的博客分析过了,启动一个新的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);                }            }        }



原创粉丝点击