diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 3bb87a33852fb..e1a02fa497f73 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -94,6 +94,7 @@ interface IActivityManager { void registerUidObserver(in IUidObserver observer, int which, int cutpoint, String callingPackage); void unregisterUidObserver(in IUidObserver observer); + boolean isUidActive(int uid, String callingPackage); // =============== End of transactions used on native side as well ============================ // Special low-level communication with activity manager. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 25d5832399eca..e3584e639abcc 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -14051,6 +14051,18 @@ public class ActivityManagerService extends IActivityManager.Stub } } + @Override + public boolean isUidActive(int uid, String callingPackage) { + if (!hasUsageStatsPermission(callingPackage)) { + enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, + "getPackageProcessState"); + } + synchronized (this) { + final UidRecord uidRecord = mActiveUids.get(uid); + return uidRecord != null && !uidRecord.setIdle; + } + } + @Override public boolean convertFromTranslucent(IBinder token) { final long origId = Binder.clearCallingIdentity();