Loading core/java/android/content/Intent.java +8 −0 Original line number Diff line number Diff line Loading @@ -5285,6 +5285,7 @@ public class Intent implements Parcelable, Cloneable { FLAG_RECEIVER_EXCLUDE_BACKGROUND, FLAG_RECEIVER_FROM_SHELL, FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS, FLAG_RECEIVER_OFFLOAD, }) @Retention(RetentionPolicy.SOURCE) public @interface Flags {} Loading Loading @@ -5329,6 +5330,7 @@ public class Intent implements Parcelable, Cloneable { FLAG_RECEIVER_EXCLUDE_BACKGROUND, FLAG_RECEIVER_FROM_SHELL, FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS, FLAG_RECEIVER_OFFLOAD, }) @Retention(RetentionPolicy.SOURCE) public @interface MutableFlags {} Loading Loading @@ -5754,6 +5756,12 @@ public class Intent implements Parcelable, Cloneable { * background priority class. */ public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000; /** * If set, when sending a broadcast the recipient will be run on the offload queue. * * @hide */ public static final int FLAG_RECEIVER_OFFLOAD = 0x80000000; /** * If this is an ordered broadcast, don't allow receivers to abort the broadcast. * They can still propagate results through to later receivers, but they can not prevent Loading services/core/java/com/android/server/am/ActivityManagerService.java +27 −4 Original line number Diff line number Diff line Loading @@ -538,14 +538,23 @@ public class ActivityManagerService extends IActivityManager.Stub BroadcastQueue mFgBroadcastQueue; BroadcastQueue mBgBroadcastQueue; BroadcastQueue mOffloadBroadcastQueue; // Convenient for easy iteration over the queues. Foreground is first // so that dispatch of foreground broadcasts gets precedence. final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2]; final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[3]; BroadcastStats mLastBroadcastStats; BroadcastStats mCurBroadcastStats; BroadcastQueue broadcastQueueForIntent(Intent intent) { if (isOnOffloadQueue(intent.getFlags())) { if (DEBUG_BROADCAST_BACKGROUND) { Slog.i(TAG_BROADCAST, "Broadcast intent " + intent + " on offload queue"); } return mOffloadBroadcastQueue; } final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0; if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST, "Broadcast intent " + intent + " on " Loading Loading @@ -2166,8 +2175,11 @@ public class ActivityManagerService extends IActivityManager.Stub "foreground", BROADCAST_FG_TIMEOUT, false); mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", BROADCAST_BG_TIMEOUT, true); mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler, "offload", BROADCAST_BG_TIMEOUT, true); mBroadcastQueues[0] = mFgBroadcastQueue; mBroadcastQueues[1] = mBgBroadcastQueue; mBroadcastQueues[2] = mOffloadBroadcastQueue; mServices = new ActiveServices(this); mProviderMap = new ProviderMap(this); Loading Loading @@ -13345,7 +13357,8 @@ public class ActivityManagerService extends IActivityManager.Stub boolean isPendingBroadcastProcessLocked(int pid) { return mFgBroadcastQueue.isPendingBroadcastProcessLocked(pid) || mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid); || mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid) || mOffloadBroadcastQueue.isPendingBroadcastProcessLocked(pid); } void skipPendingBroadcastLocked(int pid) { Loading Loading @@ -14587,10 +14600,16 @@ public class ActivityManagerService extends IActivityManager.Stub try { boolean doNext = false; BroadcastRecord r; BroadcastQueue queue; synchronized(this) { BroadcastQueue queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0 if (isOnOffloadQueue(flags)) { queue = mOffloadBroadcastQueue; } else { queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0 ? mFgBroadcastQueue : mBgBroadcastQueue; } r = queue.getMatchingOrderedReceiver(who); if (r != null) { doNext = r.queue.finishReceiverLocked(r, resultCode, Loading Loading @@ -19485,4 +19504,8 @@ public class ActivityManagerService extends IActivityManager.Stub } } } private boolean isOnOffloadQueue(int flags) { return ((flags & Intent.FLAG_RECEIVER_OFFLOAD) != 0); } } services/core/java/com/android/server/am/UserController.java +7 −5 Original line number Diff line number Diff line Loading @@ -22,14 +22,15 @@ import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM; import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP; import static android.app.ActivityManager.USER_OP_IS_CURRENT; import static android.app.ActivityManager.USER_OP_SUCCESS; import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE; import static android.os.Process.SHELL_UID; import static android.os.Process.SYSTEM_UID; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE; import static com.android.server.am.ActivityManagerService.MY_PID; import static com.android.server.am.UserState.STATE_BOOTING; import static com.android.server.am.UserState.STATE_RUNNING_LOCKED; Loading @@ -40,7 +41,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import com.android.server.wm.ActivityTaskManagerInternal; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.Dialog; Loading Loading @@ -99,6 +99,7 @@ import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemServiceManager; import com.android.server.pm.UserManagerService; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerService; import java.io.PrintWriter; Loading Loading @@ -549,7 +550,8 @@ class UserController implements Handler.Callback { final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND | Intent.FLAG_RECEIVER_OFFLOAD); mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() { @Override public void performReceive(Intent intent, int resultCode, String data, Loading Loading
core/java/android/content/Intent.java +8 −0 Original line number Diff line number Diff line Loading @@ -5285,6 +5285,7 @@ public class Intent implements Parcelable, Cloneable { FLAG_RECEIVER_EXCLUDE_BACKGROUND, FLAG_RECEIVER_FROM_SHELL, FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS, FLAG_RECEIVER_OFFLOAD, }) @Retention(RetentionPolicy.SOURCE) public @interface Flags {} Loading Loading @@ -5329,6 +5330,7 @@ public class Intent implements Parcelable, Cloneable { FLAG_RECEIVER_EXCLUDE_BACKGROUND, FLAG_RECEIVER_FROM_SHELL, FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS, FLAG_RECEIVER_OFFLOAD, }) @Retention(RetentionPolicy.SOURCE) public @interface MutableFlags {} Loading Loading @@ -5754,6 +5756,12 @@ public class Intent implements Parcelable, Cloneable { * background priority class. */ public static final int FLAG_RECEIVER_FOREGROUND = 0x10000000; /** * If set, when sending a broadcast the recipient will be run on the offload queue. * * @hide */ public static final int FLAG_RECEIVER_OFFLOAD = 0x80000000; /** * If this is an ordered broadcast, don't allow receivers to abort the broadcast. * They can still propagate results through to later receivers, but they can not prevent Loading
services/core/java/com/android/server/am/ActivityManagerService.java +27 −4 Original line number Diff line number Diff line Loading @@ -538,14 +538,23 @@ public class ActivityManagerService extends IActivityManager.Stub BroadcastQueue mFgBroadcastQueue; BroadcastQueue mBgBroadcastQueue; BroadcastQueue mOffloadBroadcastQueue; // Convenient for easy iteration over the queues. Foreground is first // so that dispatch of foreground broadcasts gets precedence. final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[2]; final BroadcastQueue[] mBroadcastQueues = new BroadcastQueue[3]; BroadcastStats mLastBroadcastStats; BroadcastStats mCurBroadcastStats; BroadcastQueue broadcastQueueForIntent(Intent intent) { if (isOnOffloadQueue(intent.getFlags())) { if (DEBUG_BROADCAST_BACKGROUND) { Slog.i(TAG_BROADCAST, "Broadcast intent " + intent + " on offload queue"); } return mOffloadBroadcastQueue; } final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0; if (DEBUG_BROADCAST_BACKGROUND) Slog.i(TAG_BROADCAST, "Broadcast intent " + intent + " on " Loading Loading @@ -2166,8 +2175,11 @@ public class ActivityManagerService extends IActivityManager.Stub "foreground", BROADCAST_FG_TIMEOUT, false); mBgBroadcastQueue = new BroadcastQueue(this, mHandler, "background", BROADCAST_BG_TIMEOUT, true); mOffloadBroadcastQueue = new BroadcastQueue(this, mHandler, "offload", BROADCAST_BG_TIMEOUT, true); mBroadcastQueues[0] = mFgBroadcastQueue; mBroadcastQueues[1] = mBgBroadcastQueue; mBroadcastQueues[2] = mOffloadBroadcastQueue; mServices = new ActiveServices(this); mProviderMap = new ProviderMap(this); Loading Loading @@ -13345,7 +13357,8 @@ public class ActivityManagerService extends IActivityManager.Stub boolean isPendingBroadcastProcessLocked(int pid) { return mFgBroadcastQueue.isPendingBroadcastProcessLocked(pid) || mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid); || mBgBroadcastQueue.isPendingBroadcastProcessLocked(pid) || mOffloadBroadcastQueue.isPendingBroadcastProcessLocked(pid); } void skipPendingBroadcastLocked(int pid) { Loading Loading @@ -14587,10 +14600,16 @@ public class ActivityManagerService extends IActivityManager.Stub try { boolean doNext = false; BroadcastRecord r; BroadcastQueue queue; synchronized(this) { BroadcastQueue queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0 if (isOnOffloadQueue(flags)) { queue = mOffloadBroadcastQueue; } else { queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0 ? mFgBroadcastQueue : mBgBroadcastQueue; } r = queue.getMatchingOrderedReceiver(who); if (r != null) { doNext = r.queue.finishReceiverLocked(r, resultCode, Loading Loading @@ -19485,4 +19504,8 @@ public class ActivityManagerService extends IActivityManager.Stub } } } private boolean isOnOffloadQueue(int flags) { return ((flags & Intent.FLAG_RECEIVER_OFFLOAD) != 0); } }
services/core/java/com/android/server/am/UserController.java +7 −5 Original line number Diff line number Diff line Loading @@ -22,14 +22,15 @@ import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM; import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP; import static android.app.ActivityManager.USER_OP_IS_CURRENT; import static android.app.ActivityManager.USER_OP_SUCCESS; import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE; import static android.os.Process.SHELL_UID; import static android.os.Process.SYSTEM_UID; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL; import static android.app.ActivityManagerInternal.ALLOW_NON_FULL_IN_PROFILE; import static com.android.server.am.ActivityManagerService.MY_PID; import static com.android.server.am.UserState.STATE_BOOTING; import static com.android.server.am.UserState.STATE_RUNNING_LOCKED; Loading @@ -40,7 +41,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import com.android.server.wm.ActivityTaskManagerInternal; import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.Dialog; Loading Loading @@ -99,6 +99,7 @@ import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.SystemServiceManager; import com.android.server.pm.UserManagerService; import com.android.server.wm.ActivityTaskManagerInternal; import com.android.server.wm.WindowManagerService; import java.io.PrintWriter; Loading Loading @@ -549,7 +550,8 @@ class UserController implements Handler.Callback { final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND | Intent.FLAG_RECEIVER_OFFLOAD); mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() { @Override public void performReceive(Intent intent, int resultCode, String data, Loading