Loading services/java/com/android/server/am/ActivityManagerService.java +48 −53 Original line number Diff line number Diff line Loading @@ -279,9 +279,6 @@ public final class ActivityManagerService extends ActivityManagerNative /** Run all ActivityStacks through this */ ActivityStackSupervisor mStackSupervisor; /** The current stack for manipulating */ public ActivityStack mFocusedStack; private final boolean mHeadless; // Whether we should show our dialogs (ANR, crash, etc) or just perform their Loading Loading @@ -2379,7 +2376,7 @@ public final class ActivityManagerService extends ActivityManagerNative intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setComponent(new ComponentName( ri.activityInfo.packageName, ri.activityInfo.name)); mFocusedStack.startActivityLocked(null, intent, null, ri.activityInfo, getMainStack().startActivityLocked(null, intent, null, ri.activityInfo, null, null, 0, 0, 0, null, 0, null, false, null); } } Loading Loading @@ -2539,7 +2536,7 @@ public final class ActivityManagerService extends ActivityManagerNative enforceNotIsolatedCaller("startActivity"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivity", null); return mFocusedStack.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, return getMainStack().startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profileFile, profileFd, null, null, options, userId); } Loading @@ -2553,7 +2550,7 @@ public final class ActivityManagerService extends ActivityManagerNative userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityAndWait", null); WaitResult res = new WaitResult(); mFocusedStack.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, getMainStack().startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profileFile, profileFd, res, null, options, UserHandle.getCallingUserId()); return res; Loading @@ -2567,7 +2564,7 @@ public final class ActivityManagerService extends ActivityManagerNative enforceNotIsolatedCaller("startActivityWithConfig"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityWithConfig", null); int ret = mFocusedStack.startActivityMayWait(caller, -1, callingPackage, intent, int ret = getMainStack().startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, null, null, null, config, options, userId); return ret; Loading @@ -2594,9 +2591,9 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized (this) { // If this is coming from the currently resumed activity, it is // effectively saying that app switches are allowed at this point. if (mFocusedStack.mResumedActivity != null && mFocusedStack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) { final ActivityStack stack = getMainStack(); if (stack.mResumedActivity != null && stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) { mAppSwitchesAllowedTime = 0; } } Loading @@ -2605,6 +2602,7 @@ public final class ActivityManagerService extends ActivityManagerNative return ret; } @Override public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent, Bundle options) { // Refuse possible leaked file descriptors Loading Loading @@ -2708,19 +2706,20 @@ public final class ActivityManagerService extends ActivityManagerNative userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityInPackage", null); int ret = mFocusedStack.startActivityMayWait(null, uid, callingPackage, intent, resolvedType, int ret = getMainStack().startActivityMayWait(null, uid, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, null, null, null, null, options, userId); return ret; } @Override public final int startActivities(IApplicationThread caller, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle options, int userId) { enforceNotIsolatedCaller("startActivities"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivity", null); int ret = mFocusedStack.startActivities(caller, -1, callingPackage, intents, int ret = getMainStack().startActivities(caller, -1, callingPackage, intents, resolvedTypes, resultTo, options, userId); return ret; } Loading @@ -2731,7 +2730,7 @@ public final class ActivityManagerService extends ActivityManagerNative userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityInPackage", null); int ret = mFocusedStack.startActivities(null, uid, callingPackage, intents, resolvedTypes, int ret = getMainStack().startActivities(null, uid, callingPackage, intents, resolvedTypes, resultTo, options, userId); return ret; } Loading Loading @@ -2764,6 +2763,7 @@ public final class ActivityManagerService extends ActivityManagerNative mRecentTasks.add(0, task); } @Override public void setRequestedOrientation(IBinder token, int requestedOrientation) { synchronized (this) { Loading @@ -2786,6 +2786,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } @Override public int getRequestedOrientation(IBinder token) { synchronized (this) { ActivityRecord r = ActivityRecord.isInStackLocked(token); Loading Loading @@ -4163,7 +4164,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (localLOGV) Slog.v( TAG, "Binding process pid " + pid + " to record " + app); String processName = app.processName; final String processName = app.processName; try { AppDeathRecipient adr = new AppDeathRecipient( app, pid, thread); Loading Loading @@ -4278,24 +4279,14 @@ public final class ActivityManagerService extends ActivityManagerNative boolean didSomething = false; // See if the top visible activity is waiting to run in this process... ActivityRecord hr = mFocusedStack.topRunningActivityLocked(null); if (hr != null && normalMode) { if (hr.app == null && app.uid == hr.info.applicationInfo.uid && processName.equals(hr.processName)) { if (normalMode) { try { if (mHeadless) { Slog.e(TAG, "Starting activities not supported on headless device: " + hr); } else if (mFocusedStack.realStartActivityLocked(hr, app, true, true)) { if (mStackSupervisor.attachApplicationLocked(app, mHeadless)) { didSomething = true; } } catch (Exception e) { Slog.w(TAG, "Exception in new application when starting activity " + hr.intent.getComponent().flattenToShortString(), e); badApp = true; } } else { mFocusedStack.ensureActivitiesVisibleLocked(hr, null, processName, 0); } } // Find any services that should be running in this process... Loading @@ -4310,7 +4301,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Check if a next-broadcast receiver is in this process... if (!badApp && isPendingBroadcastProcessLocked(pid)) { try { didSomething = sendPendingBroadcastsLocked(app); didSomething |= sendPendingBroadcastsLocked(app); } catch (Exception e) { // If the app died trying to launch the receiver we declare it 'bad' badApp = true; Loading Loading @@ -5702,7 +5693,7 @@ public final class ActivityManagerService extends ActivityManagerNative } // TODO: Improve with MRU list from all ActivityStacks. topRecord = mFocusedStack.getTasksLocked(maxNum, receiver, pending, list); topRecord = mStackSupervisor.getTasksLocked(maxNum, receiver, pending, list); if (!pending.pendingRecords.isEmpty()) { mPendingThumbnails.add(pending); Loading Loading @@ -6970,7 +6961,7 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { final long origId = Binder.clearCallingIdentity(); try { mFocusedStack.unhandledBackLocked(); getMainStack().unhandledBackLocked(); } finally { Binder.restoreCallingIdentity(origId); } Loading Loading @@ -7360,7 +7351,7 @@ public final class ActivityManagerService extends ActivityManagerNative PendingActivityExtras pae; Bundle extras = new Bundle(); synchronized (this) { ActivityRecord activity = mFocusedStack.mResumedActivity; ActivityRecord activity = getMainStack().mResumedActivity; if (activity == null) { Slog.w(TAG, "getTopActivityExtras failed: no resumed activity"); return null; Loading Loading @@ -7456,7 +7447,7 @@ public final class ActivityManagerService extends ActivityManagerNative public boolean isTopActivityImmersive() { enforceNotIsolatedCaller("startActivity"); synchronized (this) { ActivityRecord r = mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = getMainStack().topRunningActivityLocked(null); return (r != null) ? r.immersive : false; } } Loading Loading @@ -7954,7 +7945,7 @@ public final class ActivityManagerService extends ActivityManagerNative } finally { Binder.restoreCallingIdentity(ident); } mFocusedStack.resumeTopActivityLocked(null); mStackSupervisor.resumeTopActivityLocked(); sendUserSwitchBroadcastsLocked(-1, mCurrentUserId); } } Loading Loading @@ -9338,7 +9329,7 @@ public final class ActivityManagerService extends ActivityManagerNative } pw.println(" mConfiguration: " + mConfiguration); if (dumpAll) { pw.println(" mConfigWillChange: " + mFocusedStack.mConfigWillChange); pw.println(" mConfigWillChange: " + getMainStack().mConfigWillChange); if (mCompatModePackages.getPackages().size() > 0) { boolean printed = false; for (Map.Entry<String, Integer> entry Loading Loading @@ -9398,8 +9389,8 @@ public final class ActivityManagerService extends ActivityManagerNative pw.print(" mLastPowerCheckUptime="); TimeUtils.formatDuration(mLastPowerCheckUptime, pw); pw.println(""); pw.println(" mGoingToSleep=" + mFocusedStack.mGoingToSleep); pw.println(" mLaunchingActivity=" + mFocusedStack.mLaunchingActivity); pw.println(" mGoingToSleep=" + getMainStack().mGoingToSleep); pw.println(" mLaunchingActivity=" + getMainStack().mLaunchingActivity); pw.println(" mAdjSeq=" + mAdjSeq + " mLruSeq=" + mLruSeq); pw.println(" mNumNonHiddenProcs=" + mNumNonHiddenProcs + " mNumHiddenProcs=" + mNumHiddenProcs Loading Loading @@ -9586,7 +9577,7 @@ public final class ActivityManagerService extends ActivityManagerNative ArrayList<ActivityRecord> activities; synchronized (this) { activities = mFocusedStack.getDumpActivitiesLocked(name); activities = mStackSupervisor.getDumpActivitiesLocked(name); } if (activities.size() <= 0) { Loading Loading @@ -12132,6 +12123,10 @@ public final class ActivityManagerService extends ActivityManagerNative return config; } ActivityStack getMainStack() { return mStackSupervisor.getMainStack(); } public Configuration getConfiguration() { Configuration ci; synchronized(this) { Loading Loading @@ -13068,8 +13063,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } return !processingBroadcasts && (mSleeping || (mFocusedStack.mResumedActivity != null && mFocusedStack.mResumedActivity.idle)); && (mSleeping || mStackSupervisor.allResumedActivitiesIdle()); } /** Loading Loading @@ -13353,11 +13347,12 @@ public final class ActivityManagerService extends ActivityManagerNative } private final ActivityRecord resumedAppLocked() { ActivityRecord resumedActivity = mFocusedStack.mResumedActivity; final ActivityStack stack = mStackSupervisor.getMainStack(); ActivityRecord resumedActivity = stack.mResumedActivity; if (resumedActivity == null || resumedActivity.app == null) { resumedActivity = mFocusedStack.mPausingActivity; resumedActivity = stack.mPausingActivity; if (resumedActivity == null || resumedActivity.app == null) { resumedActivity = mFocusedStack.topRunningActivityLocked(null); resumedActivity = stack.topRunningActivityLocked(null); } } return resumedActivity; services/java/com/android/server/am/ActivityStackSupervisor.java +71 −6 Original line number Diff line number Diff line Loading @@ -20,13 +20,14 @@ import static com.android.server.am.ActivityManagerService.DEBUG_CLEANUP; import static com.android.server.am.ActivityManagerService.DEBUG_PAUSE; import static com.android.server.am.ActivityManagerService.TAG; import android.app.IThumbnailReceiver; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Looper; import android.os.RemoteException; import android.util.EventLog; import android.util.Slog; import java.io.FileDescriptor; Loading Loading @@ -54,13 +55,13 @@ public class ActivityStackSupervisor { /** The stack containing the launcher app */ private ActivityStack mHomeStack; /** The stack currently receiving input or launching the next activity */ private ActivityStack mMainStack; /** All the non-launcher stacks */ private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); private boolean mHomeOnTop = true; public ActivityStackSupervisor(ActivityManagerService service, Context context, Looper looper) { mService = service; Loading @@ -71,7 +72,6 @@ public class ActivityStackSupervisor { void init() { mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID, this); setMainStack(mHomeStack); mService.mFocusedStack = mHomeStack; mStacks.add(mHomeStack); } Loading @@ -82,10 +82,18 @@ public class ActivityStackSupervisor { } } boolean isHomeStackMain() { return mHomeStack == mMainStack; } boolean isMainStack(ActivityStack stack) { return stack == mMainStack; } ActivityStack getMainStack() { return mMainStack; } void setMainStack(ActivityStack stack) { mMainStack = stack; } Loading Loading @@ -115,10 +123,63 @@ public class ActivityStackSupervisor { return mCurTaskId; } boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception { boolean didSomething = false; final String processName = app.processName; for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); ActivityRecord hr = stack.topRunningActivityLocked(null); if (hr != null) { if (hr.app == null && app.uid == hr.info.applicationInfo.uid && processName.equals(hr.processName)) { try { if (headless) { Slog.e(TAG, "Starting activities not supported on headless device: " + hr); } else if (stack.realStartActivityLocked(hr, app, true, true)) { didSomething = true; } } catch (Exception e) { Slog.w(TAG, "Exception in new application when starting activity " + hr.intent.getComponent().flattenToShortString(), e); throw e; } } else { stack.ensureActivitiesVisibleLocked(hr, null, processName, 0); } } } return didSomething; } boolean allResumedActivitiesIdle() { for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { if (mStacks.get(stackNdx).mResumedActivity == null || !mStacks.get(stackNdx).mResumedActivity.idle) { return false; } } return true; } ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver, PendingThumbnailsRecord pending, List<RunningTaskInfo> list) { ActivityRecord r = null; final int numStacks = mStacks.size(); for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); final ActivityRecord ar = stack.getTasksLocked(maxNum - list.size(), receiver, pending, list); if (isMainStack(stack)) { r = ar; } } return r; } void startHomeActivity(Intent intent, ActivityInfo aInfo) { mHomeStack.startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0, null, false, null); mHomeOnTop = true; } void handleAppDiedLocked(ProcessRecord app, boolean restarting) { Loading Loading @@ -178,7 +239,7 @@ public class ActivityStackSupervisor { void resumeTopActivityLocked() { final int start, end; if (mHomeOnTop) { if (isHomeStackMain()) { start = 0; end = 1; } else { Loading Loading @@ -341,6 +402,10 @@ public class ActivityStackSupervisor { pw.println(mDismissKeyguardOnNextActivity); } ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { return mMainStack.getDumpActivitiesLocked(name); } boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient, String dumpPackage) { final int numStacks = mStacks.size(); Loading services/java/com/android/server/am/CompatModePackages.java +8 −8 Original line number Diff line number Diff line Loading @@ -166,7 +166,7 @@ public class CompatModePackages { } public boolean getFrontActivityAskCompatModeLocked() { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r == null) { return false; } Loading @@ -178,7 +178,7 @@ public class CompatModePackages { } public void setFrontActivityAskCompatModeLocked(boolean ask) { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r != null) { setPackageAskCompatModeLocked(r.packageName, ask); } Loading @@ -200,7 +200,7 @@ public class CompatModePackages { } public int getFrontActivityScreenCompatModeLocked() { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r == null) { return ActivityManager.COMPAT_MODE_UNKNOWN; } Loading @@ -208,7 +208,7 @@ public class CompatModePackages { } public void setFrontActivityScreenCompatModeLocked(int mode) { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r == null) { Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity"); return; Loading Loading @@ -295,8 +295,8 @@ public class CompatModePackages { Message msg = mHandler.obtainMessage(MSG_WRITE); mHandler.sendMessageDelayed(msg, 10000); ActivityRecord starting = mService.mFocusedStack.restartPackage(packageName); final ActivityStack stack = mService.getMainStack(); ActivityRecord starting = stack.restartPackage(packageName); // Tell all processes that loaded this package about the change. for (int i=mService.mLruProcesses.size()-1; i>=0; i--) { Loading @@ -315,10 +315,10 @@ public class CompatModePackages { } if (starting != null) { mService.mFocusedStack.ensureActivityConfigurationLocked(starting, 0); stack.ensureActivityConfigurationLocked(starting, 0); // And we need to make sure at this point that all other activities // are made visible with the correct configuration. mService.mFocusedStack.ensureActivitiesVisibleLocked(starting, 0); stack.ensureActivitiesVisibleLocked(starting, 0); } } } Loading Loading
services/java/com/android/server/am/ActivityManagerService.java +48 −53 Original line number Diff line number Diff line Loading @@ -279,9 +279,6 @@ public final class ActivityManagerService extends ActivityManagerNative /** Run all ActivityStacks through this */ ActivityStackSupervisor mStackSupervisor; /** The current stack for manipulating */ public ActivityStack mFocusedStack; private final boolean mHeadless; // Whether we should show our dialogs (ANR, crash, etc) or just perform their Loading Loading @@ -2379,7 +2376,7 @@ public final class ActivityManagerService extends ActivityManagerNative intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setComponent(new ComponentName( ri.activityInfo.packageName, ri.activityInfo.name)); mFocusedStack.startActivityLocked(null, intent, null, ri.activityInfo, getMainStack().startActivityLocked(null, intent, null, ri.activityInfo, null, null, 0, 0, 0, null, 0, null, false, null); } } Loading Loading @@ -2539,7 +2536,7 @@ public final class ActivityManagerService extends ActivityManagerNative enforceNotIsolatedCaller("startActivity"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivity", null); return mFocusedStack.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, return getMainStack().startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profileFile, profileFd, null, null, options, userId); } Loading @@ -2553,7 +2550,7 @@ public final class ActivityManagerService extends ActivityManagerNative userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityAndWait", null); WaitResult res = new WaitResult(); mFocusedStack.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, getMainStack().startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profileFile, profileFd, res, null, options, UserHandle.getCallingUserId()); return res; Loading @@ -2567,7 +2564,7 @@ public final class ActivityManagerService extends ActivityManagerNative enforceNotIsolatedCaller("startActivityWithConfig"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityWithConfig", null); int ret = mFocusedStack.startActivityMayWait(caller, -1, callingPackage, intent, int ret = getMainStack().startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, null, null, null, config, options, userId); return ret; Loading @@ -2594,9 +2591,9 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized (this) { // If this is coming from the currently resumed activity, it is // effectively saying that app switches are allowed at this point. if (mFocusedStack.mResumedActivity != null && mFocusedStack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) { final ActivityStack stack = getMainStack(); if (stack.mResumedActivity != null && stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) { mAppSwitchesAllowedTime = 0; } } Loading @@ -2605,6 +2602,7 @@ public final class ActivityManagerService extends ActivityManagerNative return ret; } @Override public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent, Bundle options) { // Refuse possible leaked file descriptors Loading Loading @@ -2708,19 +2706,20 @@ public final class ActivityManagerService extends ActivityManagerNative userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityInPackage", null); int ret = mFocusedStack.startActivityMayWait(null, uid, callingPackage, intent, resolvedType, int ret = getMainStack().startActivityMayWait(null, uid, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, null, null, null, null, options, userId); return ret; } @Override public final int startActivities(IApplicationThread caller, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle options, int userId) { enforceNotIsolatedCaller("startActivities"); userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivity", null); int ret = mFocusedStack.startActivities(caller, -1, callingPackage, intents, int ret = getMainStack().startActivities(caller, -1, callingPackage, intents, resolvedTypes, resultTo, options, userId); return ret; } Loading @@ -2731,7 +2730,7 @@ public final class ActivityManagerService extends ActivityManagerNative userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, false, true, "startActivityInPackage", null); int ret = mFocusedStack.startActivities(null, uid, callingPackage, intents, resolvedTypes, int ret = getMainStack().startActivities(null, uid, callingPackage, intents, resolvedTypes, resultTo, options, userId); return ret; } Loading Loading @@ -2764,6 +2763,7 @@ public final class ActivityManagerService extends ActivityManagerNative mRecentTasks.add(0, task); } @Override public void setRequestedOrientation(IBinder token, int requestedOrientation) { synchronized (this) { Loading @@ -2786,6 +2786,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } @Override public int getRequestedOrientation(IBinder token) { synchronized (this) { ActivityRecord r = ActivityRecord.isInStackLocked(token); Loading Loading @@ -4163,7 +4164,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (localLOGV) Slog.v( TAG, "Binding process pid " + pid + " to record " + app); String processName = app.processName; final String processName = app.processName; try { AppDeathRecipient adr = new AppDeathRecipient( app, pid, thread); Loading Loading @@ -4278,24 +4279,14 @@ public final class ActivityManagerService extends ActivityManagerNative boolean didSomething = false; // See if the top visible activity is waiting to run in this process... ActivityRecord hr = mFocusedStack.topRunningActivityLocked(null); if (hr != null && normalMode) { if (hr.app == null && app.uid == hr.info.applicationInfo.uid && processName.equals(hr.processName)) { if (normalMode) { try { if (mHeadless) { Slog.e(TAG, "Starting activities not supported on headless device: " + hr); } else if (mFocusedStack.realStartActivityLocked(hr, app, true, true)) { if (mStackSupervisor.attachApplicationLocked(app, mHeadless)) { didSomething = true; } } catch (Exception e) { Slog.w(TAG, "Exception in new application when starting activity " + hr.intent.getComponent().flattenToShortString(), e); badApp = true; } } else { mFocusedStack.ensureActivitiesVisibleLocked(hr, null, processName, 0); } } // Find any services that should be running in this process... Loading @@ -4310,7 +4301,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Check if a next-broadcast receiver is in this process... if (!badApp && isPendingBroadcastProcessLocked(pid)) { try { didSomething = sendPendingBroadcastsLocked(app); didSomething |= sendPendingBroadcastsLocked(app); } catch (Exception e) { // If the app died trying to launch the receiver we declare it 'bad' badApp = true; Loading Loading @@ -5702,7 +5693,7 @@ public final class ActivityManagerService extends ActivityManagerNative } // TODO: Improve with MRU list from all ActivityStacks. topRecord = mFocusedStack.getTasksLocked(maxNum, receiver, pending, list); topRecord = mStackSupervisor.getTasksLocked(maxNum, receiver, pending, list); if (!pending.pendingRecords.isEmpty()) { mPendingThumbnails.add(pending); Loading Loading @@ -6970,7 +6961,7 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { final long origId = Binder.clearCallingIdentity(); try { mFocusedStack.unhandledBackLocked(); getMainStack().unhandledBackLocked(); } finally { Binder.restoreCallingIdentity(origId); } Loading Loading @@ -7360,7 +7351,7 @@ public final class ActivityManagerService extends ActivityManagerNative PendingActivityExtras pae; Bundle extras = new Bundle(); synchronized (this) { ActivityRecord activity = mFocusedStack.mResumedActivity; ActivityRecord activity = getMainStack().mResumedActivity; if (activity == null) { Slog.w(TAG, "getTopActivityExtras failed: no resumed activity"); return null; Loading Loading @@ -7456,7 +7447,7 @@ public final class ActivityManagerService extends ActivityManagerNative public boolean isTopActivityImmersive() { enforceNotIsolatedCaller("startActivity"); synchronized (this) { ActivityRecord r = mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = getMainStack().topRunningActivityLocked(null); return (r != null) ? r.immersive : false; } } Loading Loading @@ -7954,7 +7945,7 @@ public final class ActivityManagerService extends ActivityManagerNative } finally { Binder.restoreCallingIdentity(ident); } mFocusedStack.resumeTopActivityLocked(null); mStackSupervisor.resumeTopActivityLocked(); sendUserSwitchBroadcastsLocked(-1, mCurrentUserId); } } Loading Loading @@ -9338,7 +9329,7 @@ public final class ActivityManagerService extends ActivityManagerNative } pw.println(" mConfiguration: " + mConfiguration); if (dumpAll) { pw.println(" mConfigWillChange: " + mFocusedStack.mConfigWillChange); pw.println(" mConfigWillChange: " + getMainStack().mConfigWillChange); if (mCompatModePackages.getPackages().size() > 0) { boolean printed = false; for (Map.Entry<String, Integer> entry Loading Loading @@ -9398,8 +9389,8 @@ public final class ActivityManagerService extends ActivityManagerNative pw.print(" mLastPowerCheckUptime="); TimeUtils.formatDuration(mLastPowerCheckUptime, pw); pw.println(""); pw.println(" mGoingToSleep=" + mFocusedStack.mGoingToSleep); pw.println(" mLaunchingActivity=" + mFocusedStack.mLaunchingActivity); pw.println(" mGoingToSleep=" + getMainStack().mGoingToSleep); pw.println(" mLaunchingActivity=" + getMainStack().mLaunchingActivity); pw.println(" mAdjSeq=" + mAdjSeq + " mLruSeq=" + mLruSeq); pw.println(" mNumNonHiddenProcs=" + mNumNonHiddenProcs + " mNumHiddenProcs=" + mNumHiddenProcs Loading Loading @@ -9586,7 +9577,7 @@ public final class ActivityManagerService extends ActivityManagerNative ArrayList<ActivityRecord> activities; synchronized (this) { activities = mFocusedStack.getDumpActivitiesLocked(name); activities = mStackSupervisor.getDumpActivitiesLocked(name); } if (activities.size() <= 0) { Loading Loading @@ -12132,6 +12123,10 @@ public final class ActivityManagerService extends ActivityManagerNative return config; } ActivityStack getMainStack() { return mStackSupervisor.getMainStack(); } public Configuration getConfiguration() { Configuration ci; synchronized(this) { Loading Loading @@ -13068,8 +13063,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } return !processingBroadcasts && (mSleeping || (mFocusedStack.mResumedActivity != null && mFocusedStack.mResumedActivity.idle)); && (mSleeping || mStackSupervisor.allResumedActivitiesIdle()); } /** Loading Loading @@ -13353,11 +13347,12 @@ public final class ActivityManagerService extends ActivityManagerNative } private final ActivityRecord resumedAppLocked() { ActivityRecord resumedActivity = mFocusedStack.mResumedActivity; final ActivityStack stack = mStackSupervisor.getMainStack(); ActivityRecord resumedActivity = stack.mResumedActivity; if (resumedActivity == null || resumedActivity.app == null) { resumedActivity = mFocusedStack.mPausingActivity; resumedActivity = stack.mPausingActivity; if (resumedActivity == null || resumedActivity.app == null) { resumedActivity = mFocusedStack.topRunningActivityLocked(null); resumedActivity = stack.topRunningActivityLocked(null); } } return resumedActivity;
services/java/com/android/server/am/ActivityStackSupervisor.java +71 −6 Original line number Diff line number Diff line Loading @@ -20,13 +20,14 @@ import static com.android.server.am.ActivityManagerService.DEBUG_CLEANUP; import static com.android.server.am.ActivityManagerService.DEBUG_PAUSE; import static com.android.server.am.ActivityManagerService.TAG; import android.app.IThumbnailReceiver; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Looper; import android.os.RemoteException; import android.util.EventLog; import android.util.Slog; import java.io.FileDescriptor; Loading Loading @@ -54,13 +55,13 @@ public class ActivityStackSupervisor { /** The stack containing the launcher app */ private ActivityStack mHomeStack; /** The stack currently receiving input or launching the next activity */ private ActivityStack mMainStack; /** All the non-launcher stacks */ private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); private boolean mHomeOnTop = true; public ActivityStackSupervisor(ActivityManagerService service, Context context, Looper looper) { mService = service; Loading @@ -71,7 +72,6 @@ public class ActivityStackSupervisor { void init() { mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID, this); setMainStack(mHomeStack); mService.mFocusedStack = mHomeStack; mStacks.add(mHomeStack); } Loading @@ -82,10 +82,18 @@ public class ActivityStackSupervisor { } } boolean isHomeStackMain() { return mHomeStack == mMainStack; } boolean isMainStack(ActivityStack stack) { return stack == mMainStack; } ActivityStack getMainStack() { return mMainStack; } void setMainStack(ActivityStack stack) { mMainStack = stack; } Loading Loading @@ -115,10 +123,63 @@ public class ActivityStackSupervisor { return mCurTaskId; } boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception { boolean didSomething = false; final String processName = app.processName; for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); ActivityRecord hr = stack.topRunningActivityLocked(null); if (hr != null) { if (hr.app == null && app.uid == hr.info.applicationInfo.uid && processName.equals(hr.processName)) { try { if (headless) { Slog.e(TAG, "Starting activities not supported on headless device: " + hr); } else if (stack.realStartActivityLocked(hr, app, true, true)) { didSomething = true; } } catch (Exception e) { Slog.w(TAG, "Exception in new application when starting activity " + hr.intent.getComponent().flattenToShortString(), e); throw e; } } else { stack.ensureActivitiesVisibleLocked(hr, null, processName, 0); } } } return didSomething; } boolean allResumedActivitiesIdle() { for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { if (mStacks.get(stackNdx).mResumedActivity == null || !mStacks.get(stackNdx).mResumedActivity.idle) { return false; } } return true; } ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver, PendingThumbnailsRecord pending, List<RunningTaskInfo> list) { ActivityRecord r = null; final int numStacks = mStacks.size(); for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); final ActivityRecord ar = stack.getTasksLocked(maxNum - list.size(), receiver, pending, list); if (isMainStack(stack)) { r = ar; } } return r; } void startHomeActivity(Intent intent, ActivityInfo aInfo) { mHomeStack.startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0, null, false, null); mHomeOnTop = true; } void handleAppDiedLocked(ProcessRecord app, boolean restarting) { Loading Loading @@ -178,7 +239,7 @@ public class ActivityStackSupervisor { void resumeTopActivityLocked() { final int start, end; if (mHomeOnTop) { if (isHomeStackMain()) { start = 0; end = 1; } else { Loading Loading @@ -341,6 +402,10 @@ public class ActivityStackSupervisor { pw.println(mDismissKeyguardOnNextActivity); } ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { return mMainStack.getDumpActivitiesLocked(name); } boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient, String dumpPackage) { final int numStacks = mStacks.size(); Loading
services/java/com/android/server/am/CompatModePackages.java +8 −8 Original line number Diff line number Diff line Loading @@ -166,7 +166,7 @@ public class CompatModePackages { } public boolean getFrontActivityAskCompatModeLocked() { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r == null) { return false; } Loading @@ -178,7 +178,7 @@ public class CompatModePackages { } public void setFrontActivityAskCompatModeLocked(boolean ask) { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r != null) { setPackageAskCompatModeLocked(r.packageName, ask); } Loading @@ -200,7 +200,7 @@ public class CompatModePackages { } public int getFrontActivityScreenCompatModeLocked() { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r == null) { return ActivityManager.COMPAT_MODE_UNKNOWN; } Loading @@ -208,7 +208,7 @@ public class CompatModePackages { } public void setFrontActivityScreenCompatModeLocked(int mode) { ActivityRecord r = mService.mFocusedStack.topRunningActivityLocked(null); ActivityRecord r = mService.getMainStack().topRunningActivityLocked(null); if (r == null) { Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity"); return; Loading Loading @@ -295,8 +295,8 @@ public class CompatModePackages { Message msg = mHandler.obtainMessage(MSG_WRITE); mHandler.sendMessageDelayed(msg, 10000); ActivityRecord starting = mService.mFocusedStack.restartPackage(packageName); final ActivityStack stack = mService.getMainStack(); ActivityRecord starting = stack.restartPackage(packageName); // Tell all processes that loaded this package about the change. for (int i=mService.mLruProcesses.size()-1; i>=0; i--) { Loading @@ -315,10 +315,10 @@ public class CompatModePackages { } if (starting != null) { mService.mFocusedStack.ensureActivityConfigurationLocked(starting, 0); stack.ensureActivityConfigurationLocked(starting, 0); // And we need to make sure at this point that all other activities // are made visible with the correct configuration. mService.mFocusedStack.ensureActivitiesVisibleLocked(starting, 0); stack.ensureActivitiesVisibleLocked(starting, 0); } } } Loading