2014-11-03 97 views
6

我在其中一個應用程序中使用getRunningTask API來查找Foreground應用程序。自從Lollipop以來,此API已被棄用。在棄用之後,我首選getRunningAppProcess API以及Importance_Foreground。我也排除了這個列表中的REASON_SERVICE和REASON_PROVIDER。我根據邏輯過濾了系統應用程序,該程序完美運行。問題是,如果應用程序A在前臺,我會將應用程序B作爲一個尖峯。所以,這種方法目前是有問題的。有沒有其他的getRunningTask API的替代?還是我錯過了目前方法中的任何簡單的事情。請幫助傢伙。是否有getRunningTask API的替代方案

+0

這真的取決於你的目的的信息。如果它是合法的,那麼可能有其他選擇,但它們取決於你想要完成的是什麼。 – 2014-11-03 13:20:09

回答

30

基於答案this question

String getTopPackage(){ 
    long ts = System.currentTimeMillis(); 
    UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats"); 
    List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, ts-1000, ts); 
    if (usageStats == null || usageStats.size() == 0) { 
     return NONE_PKG; 
    } 
    Collections.sort(usageStats, mRecentComp); 
    return usageStats.get(0).getPackageName(); 
} 

這是mRecentComp:需要

static class RecentUseComparator implements Comparator<UsageStats> { 

    @Override 
    public int compare(UsageStats lhs, UsageStats rhs) { 
     return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : (lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1; 
    } 
} 

此權限:

<uses-permission xmlns:tools="http://schemas.android.com/tools" 
    android:name="android.permission.PACKAGE_USAGE_STATS" 
    tools:ignore="ProtectedPermissions" /> 

你會需要用戶授權請求統計信息,使用它來引導用戶進入設置頁面:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
startActivity(intent); 

你可以檢查您是否已經擁有的權限是這樣的:

public static boolean needPermissionForBlocking(Context context) { 
    try { 
     PackageManager packageManager = context.getPackageManager(); 
     ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), 0); 
     AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 
     int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName); 
     return (mode != AppOpsManager.MODE_ALLOWED); 
    } catch (PackageManager.NameNotFoundException e) { 
     return true; 
    } 
} 
+0

謝謝。所有提到的東西都像魅力一樣。但還有一件事,我可以使用任何種類的Content Observer來知道用戶何時關閉或關閉它?我會在得到迴應後很快接受答案。 – madhu 2014-12-15 05:27:56

+0

我想你可以試試這個http://stackoverflow.com/questions/6896746/android-is-there-a-broadcast-action-for-volume-changes。 – 2014-12-15 17:25:04

+0

如果這不起作用,你可以在我的答案中使用needPermission函數來檢查它是否打開。 – 2014-12-15 17:26:25

3

通過ActivityManager.getRunningAppProcesses()獲取的RunningAppProcessInfo列表。 選擇RuningAppProcessInfo,其importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND及其processState == ActivityManager.START_TASK_TO_FRONT。 (前者是容易的,後者則是困難的,因爲反射是必要的)

見我的回答對這個問題getRunningTasks doesn't work in Android L

+2

在Android M預發佈中不起作用,不幸的是。 – Sam 2015-06-05 23:08:52

+0

是的。我們應該找到新的方法。 – KNaito 2015-06-06 00:55:48

相關問題