diff options
Diffstat (limited to 'core/java/android')
-rw-r--r-- | core/java/android/app/ActivityManager.java | 21 | ||||
-rw-r--r-- | core/java/android/app/ActivityManagerNative.java | 6 | ||||
-rw-r--r-- | core/java/android/app/ActivityThread.java | 20 | ||||
-rw-r--r-- | core/java/android/app/ApplicationThreadNative.java | 6 | ||||
-rw-r--r-- | core/java/android/app/IActivityManager.java | 2 | ||||
-rw-r--r-- | core/java/android/app/IApplicationThread.java | 2 | ||||
-rw-r--r-- | core/java/android/content/pm/ActivityInfo.java | 10 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageParser.java | 6 |
8 files changed, 48 insertions, 25 deletions
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 3e03893..9486a72 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -2656,17 +2656,24 @@ public class ActivityManager { /** * Start an activity in this task. Brings the task to the foreground. If this task - * is not currently active (that is, its id < 0), then the activity being started - * needs to be started as a new task and the Intent's ComponentName must match the - * base ComponenentName of the recent task entry. Otherwise, the activity being - * started must <b>not</b> be launched as a new task -- not through explicit intent - * flags nor implicitly as the singleTask or singleInstance launch modes. + * is not currently active (that is, its id < 0), then a new activity for the given + * Intent will be launched as the root of the task and the task brought to the + * foreground. Otherwise, if this task is currently active and the Intent does not specify + * an activity to launch in a new task, then a new activity for the given Intent will + * be launched on top of the task and the task brought to the foreground. If this + * task is currently active and the Intent specifies {@link Intent#FLAG_ACTIVITY_NEW_TASK} + * or would otherwise be launched in to a new task, then the activity not launched but + * this task be brought to the foreground and a new intent delivered to the top + * activity if appropriate. * - * <p>See {@link Activity#startActivity(android.content.Intent, android.os.Bundle) - * Activity.startActivity} for more information.</p> + * <p>In other words, you generally want to use an Intent here that does not specify + * {@link Intent#FLAG_ACTIVITY_NEW_TASK} or {@link Intent#FLAG_ACTIVITY_NEW_DOCUMENT}, + * and let the system do the right thing.</p> * * @param intent The Intent describing the new activity to be launched on the task. * @param options Optional launch options. + * + * @see Activity#startActivity(android.content.Intent, android.os.Bundle) */ public void startActivity(Context context, Intent intent, Bundle options) { ActivityThread thread = ActivityThread.currentActivityThread(); diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 1f7e450..394b183 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -509,8 +509,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM case ACTIVITY_PAUSED_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); - PersistableBundle persistentState = data.readPersistableBundle(); - activityPaused(token, persistentState); + activityPaused(token); reply.writeNoException(); return true; } @@ -2829,13 +2828,12 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } - public void activityPaused(IBinder token, PersistableBundle persistentState) throws RemoteException + public void activityPaused(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(token); - data.writePersistableBundle(persistentState); mRemote.transact(ACTIVITY_PAUSED_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 4f2a3bc..111689e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -563,11 +563,11 @@ public final class ActivityThread { } public final void schedulePauseActivity(IBinder token, boolean finished, - boolean userLeaving, int configChanges) { + boolean userLeaving, int configChanges, boolean dontReport) { sendMessage( finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY, token, - (userLeaving ? 1 : 0), + (userLeaving ? 1 : 0) | (dontReport ? 2 : 0), configChanges); } @@ -1283,13 +1283,15 @@ public final class ActivityThread { } break; case PAUSE_ACTIVITY: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause"); - handlePauseActivity((IBinder)msg.obj, false, msg.arg1 != 0, msg.arg2); + handlePauseActivity((IBinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2, + (msg.arg1&2) != 0); maybeSnapshot(); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case PAUSE_ACTIVITY_FINISHING: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause"); - handlePauseActivity((IBinder)msg.obj, true, msg.arg1 != 0, msg.arg2); + handlePauseActivity((IBinder)msg.obj, true, (msg.arg1&1) != 0, msg.arg2, + (msg.arg1&1) != 0); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case STOP_ACTIVITY_SHOW: @@ -3142,7 +3144,7 @@ public final class ActivityThread { } private void handlePauseActivity(IBinder token, boolean finished, - boolean userLeaving, int configChanges) { + boolean userLeaving, int configChanges, boolean dontReport) { ActivityClientRecord r = mActivities.get(token); if (r != null) { //Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r); @@ -3159,9 +3161,11 @@ public final class ActivityThread { } // Tell the activity manager we have paused. - try { - ActivityManagerNative.getDefault().activityPaused(token, r.persistentState); - } catch (RemoteException ex) { + if (!dontReport) { + try { + ActivityManagerNative.getDefault().activityPaused(token); + } catch (RemoteException ex) { + } } mSomeActivitiesChanged = true; } diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index 63e8707..0123e16 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -78,7 +78,8 @@ public abstract class ApplicationThreadNative extends Binder boolean finished = data.readInt() != 0; boolean userLeaving = data.readInt() != 0; int configChanges = data.readInt(); - schedulePauseActivity(b, finished, userLeaving, configChanges); + boolean dontReport = data.readInt() != 0; + schedulePauseActivity(b, finished, userLeaving, configChanges, dontReport); return true; } @@ -689,13 +690,14 @@ class ApplicationThreadProxy implements IApplicationThread { } public final void schedulePauseActivity(IBinder token, boolean finished, - boolean userLeaving, int configChanges) throws RemoteException { + boolean userLeaving, int configChanges, boolean dontReport) 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); + data.writeInt(dontReport ? 1 : 0); mRemote.transact(SCHEDULE_PAUSE_ACTIVITY_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 99428e8..9483680 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -111,7 +111,7 @@ public interface IActivityManager extends IInterface { public void activityResumed(IBinder token) throws RemoteException; public void activityIdle(IBinder token, Configuration config, boolean stopProfiling) throws RemoteException; - public void activityPaused(IBinder token, PersistableBundle persistentState) throws RemoteException; + public void activityPaused(IBinder token) throws RemoteException; public void activityStopped(IBinder token, Bundle state, PersistableBundle persistentState, CharSequence description) throws RemoteException; public void activitySlept(IBinder token) throws RemoteException; diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index a7546d9..f53075c 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -49,7 +49,7 @@ import java.util.Map; */ public interface IApplicationThread extends IInterface { void schedulePauseActivity(IBinder token, boolean finished, boolean userLeaving, - int configChanges) throws RemoteException; + int configChanges, boolean dontReport) throws RemoteException; void scheduleStopActivity(IBinder token, boolean showWindow, int configChanges) throws RemoteException; void scheduleWindowVisibility(IBinder token, boolean showWindow) throws RemoteException; diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index dbf49c5..8d3126d 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -255,16 +255,22 @@ public class ActivityInfo extends ComponentInfo * Bit in {@link #flags}: If set, a task rooted at this activity will have its * baseIntent replaced by the activity immediately above this. Each activity may further * relinquish its identity to the activity above it using this flag. Set from the - * android.R.attr#relinquishTaskIdentity attribute. + * {@link android.R.attr#relinquishTaskIdentity} attribute. */ public static final int FLAG_RELINQUISH_TASK_IDENTITY = 0x1000; /** * Bit in {@link #flags} indicating that tasks started with this activity are to be * removed from the recent list of tasks when the last activity in the task is finished. - * {@link android.R.attr#autoRemoveFromRecents} + * Corresponds to {@link android.R.attr#autoRemoveFromRecents} */ public static final int FLAG_AUTO_REMOVE_FROM_RECENTS = 0x2000; /** + * Bit in {@link #flags} indicating that this activity can start is creation/resume + * while the previous activity is still pausing. Corresponds to + * {@link android.R.attr#resumeWhilePausing} + */ + public static final int FLAG_RESUME_WHILE_PAUSING = 0x4000; + /** * @hide Bit in {@link #flags}: If set, this component will only be seen * by the primary user. Only works with broadcast receivers. Set from the * android.R.attr#primaryUserOnly attribute. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 6d40dcf..e0fd532 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3110,6 +3110,12 @@ public class PackageParser { false)) { a.info.flags |= ActivityInfo.FLAG_RELINQUISH_TASK_IDENTITY; } + + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestActivity_resumeWhilePausing, + false)) { + a.info.flags |= ActivityInfo.FLAG_RESUME_WHILE_PAUSING; + } } else { a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; a.info.configChanges = 0; |