2014-11-03 95 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

相关问题