Loading core/java/android/app/Activity.java +1 −0 Original line number Diff line number Diff line Loading @@ -4392,6 +4392,7 @@ public class Activity extends ContextThemeWrapper mFragments.dispatchPause(); mCalled = false; onPause(); mResumed = false; if (!mCalled && getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) { throw new SuperNotCalledException( Loading core/java/android/app/ActivityManagerNative.java +19 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case ACTIVITY_SLEPT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); activitySlept(token); reply.writeNoException(); return true; } case ACTIVITY_DESTROYED_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); Loading Loading @@ -1719,6 +1727,17 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } public void activitySlept(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(token); mRemote.transact(ACTIVITY_SLEPT_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY); reply.readException(); data.recycle(); reply.recycle(); } public void activityDestroyed(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Loading core/java/android/app/ActivityThread.java +45 −0 Original line number Diff line number Diff line Loading @@ -421,6 +421,10 @@ public final class ActivityThread { token); } public final void scheduleSleeping(IBinder token, boolean sleeping) { queueOrSendMessage(H.SLEEPING, token, sleeping ? 1 : 0); } public final void scheduleResumeActivity(IBinder token, boolean isForward) { queueOrSendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0); } Loading Loading @@ -929,6 +933,7 @@ public final class ActivityThread { public static final int SCHEDULE_CRASH = 134; public static final int DUMP_HEAP = 135; public static final int DUMP_ACTIVITY = 136; public static final int SLEEPING = 137; String codeToString(int code) { if (DEBUG_MESSAGES) { switch (code) { Loading Loading @@ -969,6 +974,7 @@ public final class ActivityThread { case SCHEDULE_CRASH: return "SCHEDULE_CRASH"; case DUMP_HEAP: return "DUMP_HEAP"; case DUMP_ACTIVITY: return "DUMP_ACTIVITY"; case SLEEPING: return "SLEEPING"; } } return "(unknown)"; Loading Loading @@ -1101,6 +1107,9 @@ public final class ActivityThread { case DUMP_ACTIVITY: handleDumpActivity((DumpComponentInfo)msg.obj); break; case SLEEPING: handleSleeping((IBinder)msg.obj, msg.arg1 != 0); break; } if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + msg.what); } Loading Loading @@ -2615,6 +2624,42 @@ public final class ActivityThread { } } private final void handleSleeping(IBinder token, boolean sleeping) { ActivityClientRecord r = mActivities.get(token); if (r == null) { Log.w(TAG, "handleWindowVisibility: no activity for token " + token); return; } if (sleeping) { if (!r.stopped) { try { // Now we are idle. r.activity.performStop(); } catch (Exception e) { if (!mInstrumentation.onException(r.activity, e)) { throw new RuntimeException( "Unable to stop activity " + r.intent.getComponent().toShortString() + ": " + e.toString(), e); } } r.stopped = true; } // Tell activity manager we slept. try { ActivityManagerNative.getDefault().activitySlept(r.token); } catch (RemoteException ex) { } } else { if (r.stopped && r.activity.mVisibleFromServer) { r.activity.performRestart(); r.stopped = false; } } } private final void deliverResults(ActivityClientRecord r, List<ResultInfo> results) { final int N = results.size(); for (int i=0; i<N; i++) { Loading core/java/android/app/ApplicationThreadNative.java +20 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,15 @@ public abstract class ApplicationThreadNative extends Binder return true; } case SCHEDULE_SLEEPING_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); IBinder b = data.readStrongBinder(); boolean sleeping = data.readInt() != 0; scheduleSleeping(b, sleeping); return true; } case SCHEDULE_RESUME_ACTIVITY_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); Loading Loading @@ -503,6 +512,17 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } public final void scheduleSleeping(IBinder token, boolean sleeping) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeStrongBinder(token); data.writeInt(sleeping ? 1 : 0); mRemote.transact(SCHEDULE_SLEEPING_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); } public final void scheduleResumeActivity(IBinder token, boolean isForward) throws RemoteException { Parcel data = Parcel.obtain(); Loading core/java/android/app/IActivityManager.java +3 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,8 @@ public interface IActivityManager extends IInterface { public void activityStopped(IBinder token, Bundle state, Bitmap thumbnail, CharSequence description) throws RemoteException; /* oneway */ public void activitySlept(IBinder token) throws RemoteException; /* oneway */ public void activityDestroyed(IBinder token) throws RemoteException; public String getCallingPackage(IBinder token) throws RemoteException; public ComponentName getCallingActivity(IBinder token) throws RemoteException; Loading Loading @@ -553,4 +555,5 @@ public interface IActivityManager extends IInterface { int DUMP_HEAP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+119; int START_ACTIVITIES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+120; int START_ACTIVITIES_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+121; int ACTIVITY_SLEPT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+122; } Loading
core/java/android/app/Activity.java +1 −0 Original line number Diff line number Diff line Loading @@ -4392,6 +4392,7 @@ public class Activity extends ContextThemeWrapper mFragments.dispatchPause(); mCalled = false; onPause(); mResumed = false; if (!mCalled && getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) { throw new SuperNotCalledException( Loading
core/java/android/app/ActivityManagerNative.java +19 −0 Original line number Diff line number Diff line Loading @@ -376,6 +376,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } case ACTIVITY_SLEPT_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); activitySlept(token); reply.writeNoException(); return true; } case ACTIVITY_DESTROYED_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); Loading Loading @@ -1719,6 +1727,17 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } public void activitySlept(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(token); mRemote.transact(ACTIVITY_SLEPT_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY); reply.readException(); data.recycle(); reply.recycle(); } public void activityDestroyed(IBinder token) throws RemoteException { Parcel data = Parcel.obtain(); Loading
core/java/android/app/ActivityThread.java +45 −0 Original line number Diff line number Diff line Loading @@ -421,6 +421,10 @@ public final class ActivityThread { token); } public final void scheduleSleeping(IBinder token, boolean sleeping) { queueOrSendMessage(H.SLEEPING, token, sleeping ? 1 : 0); } public final void scheduleResumeActivity(IBinder token, boolean isForward) { queueOrSendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0); } Loading Loading @@ -929,6 +933,7 @@ public final class ActivityThread { public static final int SCHEDULE_CRASH = 134; public static final int DUMP_HEAP = 135; public static final int DUMP_ACTIVITY = 136; public static final int SLEEPING = 137; String codeToString(int code) { if (DEBUG_MESSAGES) { switch (code) { Loading Loading @@ -969,6 +974,7 @@ public final class ActivityThread { case SCHEDULE_CRASH: return "SCHEDULE_CRASH"; case DUMP_HEAP: return "DUMP_HEAP"; case DUMP_ACTIVITY: return "DUMP_ACTIVITY"; case SLEEPING: return "SLEEPING"; } } return "(unknown)"; Loading Loading @@ -1101,6 +1107,9 @@ public final class ActivityThread { case DUMP_ACTIVITY: handleDumpActivity((DumpComponentInfo)msg.obj); break; case SLEEPING: handleSleeping((IBinder)msg.obj, msg.arg1 != 0); break; } if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + msg.what); } Loading Loading @@ -2615,6 +2624,42 @@ public final class ActivityThread { } } private final void handleSleeping(IBinder token, boolean sleeping) { ActivityClientRecord r = mActivities.get(token); if (r == null) { Log.w(TAG, "handleWindowVisibility: no activity for token " + token); return; } if (sleeping) { if (!r.stopped) { try { // Now we are idle. r.activity.performStop(); } catch (Exception e) { if (!mInstrumentation.onException(r.activity, e)) { throw new RuntimeException( "Unable to stop activity " + r.intent.getComponent().toShortString() + ": " + e.toString(), e); } } r.stopped = true; } // Tell activity manager we slept. try { ActivityManagerNative.getDefault().activitySlept(r.token); } catch (RemoteException ex) { } } else { if (r.stopped && r.activity.mVisibleFromServer) { r.activity.performRestart(); r.stopped = false; } } } private final void deliverResults(ActivityClientRecord r, List<ResultInfo> results) { final int N = results.size(); for (int i=0; i<N; i++) { Loading
core/java/android/app/ApplicationThreadNative.java +20 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,15 @@ public abstract class ApplicationThreadNative extends Binder return true; } case SCHEDULE_SLEEPING_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); IBinder b = data.readStrongBinder(); boolean sleeping = data.readInt() != 0; scheduleSleeping(b, sleeping); return true; } case SCHEDULE_RESUME_ACTIVITY_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); Loading Loading @@ -503,6 +512,17 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } public final void scheduleSleeping(IBinder token, boolean sleeping) throws RemoteException { Parcel data = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); data.writeStrongBinder(token); data.writeInt(sleeping ? 1 : 0); mRemote.transact(SCHEDULE_SLEEPING_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); data.recycle(); } public final void scheduleResumeActivity(IBinder token, boolean isForward) throws RemoteException { Parcel data = Parcel.obtain(); Loading
core/java/android/app/IActivityManager.java +3 −0 Original line number Diff line number Diff line Loading @@ -124,6 +124,8 @@ public interface IActivityManager extends IInterface { public void activityStopped(IBinder token, Bundle state, Bitmap thumbnail, CharSequence description) throws RemoteException; /* oneway */ public void activitySlept(IBinder token) throws RemoteException; /* oneway */ public void activityDestroyed(IBinder token) throws RemoteException; public String getCallingPackage(IBinder token) throws RemoteException; public ComponentName getCallingActivity(IBinder token) throws RemoteException; Loading Loading @@ -553,4 +555,5 @@ public interface IActivityManager extends IInterface { int DUMP_HEAP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+119; int START_ACTIVITIES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+120; int START_ACTIVITIES_IN_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+121; int ACTIVITY_SLEPT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+122; }