diff --git a/api/system-current.txt b/api/system-current.txt index 0e2292499c1e9..3bce8d6ccdc7d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3982,6 +3982,7 @@ package android.app { method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException; method public java.util.List getRunningServices(int) throws java.lang.SecurityException; method public deprecated java.util.List getRunningTasks(int) throws java.lang.SecurityException; + method public int getUidImportance(int); method public deprecated boolean isInLockTaskMode(); method public boolean isLowRamDevice(); method public static boolean isRunningInTestHarness(); diff --git a/api/test-current.txt b/api/test-current.txt index d22e6e47690c2..19702d5bd1c03 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -3849,6 +3849,7 @@ package android.app { method public android.app.PendingIntent getRunningServiceControlPanel(android.content.ComponentName) throws java.lang.SecurityException; method public java.util.List getRunningServices(int) throws java.lang.SecurityException; method public deprecated java.util.List getRunningTasks(int) throws java.lang.SecurityException; + method public int getUidImportance(int); method public deprecated boolean isInLockTaskMode(); method public boolean isLowRamDevice(); method public static boolean isRunningInTestHarness(); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index aede1bb67f80d..80482ca6e026d 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -3386,6 +3386,26 @@ public class ActivityManager { } } + /** + * Return the importance of a given uid, based on the processes that are + * currently running. The return value is one of the importance constants defined + * in {@link RunningAppProcessInfo}, giving you the highest importance of all the + * processes that this uid has running. If there are no processes + * running its code, {@link RunningAppProcessInfo#IMPORTANCE_GONE} is returned. + * @hide + */ + @SystemApi @TestApi + @RequiresPermission(Manifest.permission.PACKAGE_USAGE_STATS) + public int getUidImportance(int uid) { + try { + int procState = getService().getUidProcessState(uid, + mContext.getOpPackageName()); + return RunningAppProcessInfo.procStateToImportance(procState); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Callback to get reports about changes to the importance of a uid. Use with * {@link #addOnUidImportanceListener}. diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 79c2f1e1d3826..595ad35d1c576 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -463,6 +463,7 @@ interface IActivityManager { * etc. */ void keyguardGoingAway(int flags); + int getUidProcessState(int uid, in String callingPackage); void registerUidObserver(in IUidObserver observer, int which, int cutpoint, String callingPackage); void unregisterUidObserver(in IUidObserver observer); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 82d5439bb3cd2..17459eaa41ebb 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13024,6 +13024,19 @@ public class ActivityManagerService extends IActivityManager.Stub } } + @Override + public int getUidProcessState(int uid, String callingPackage) { + if (!hasUsageStatsPermission(callingPackage)) { + enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS, + "getUidProcessState"); + } + + synchronized (this) { + UidRecord uidRec = mActiveUids.get(uid); + return uidRec != null ? uidRec.curProcState : ActivityManager.PROCESS_STATE_NONEXISTENT; + } + } + @Override public void registerUidObserver(IUidObserver observer, int which, int cutpoint, String callingPackage) {