从包名获取前台活动?

3

我正在尝试从包名获取运行活动的名称(前台活动名称),如大家所知,我们可以通过以下代码获取当前正在运行的活动名称:

ActivityManager.getRunningTasks(1).get(0).topActivity.getClassName()
mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName()

但是这个工作只适用于Android 5.0以下的版本,我需要在5.0及以上的版本中完成同样的事情。

我能够获取当前包名,但无法获取活动名称。

1个回答

6
安卓棒棒糖版本开始加强了安全性;有关更多细节,请参阅此文章:getAppTask 您可以通过UsageStats类获取前台活动;首先,您必须在清单中添加此权限:
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
                                    tools:ignore="ProtectedPermissions"/>

并且这个声明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="your_application_package">

这将禁用警告,提示权限是系统级别的,不会授予第三方应用程序。设备用户可以通过“设置”应用程序授予权限。

因此,在您的MainActivity的onCreate()方法中,检查用户是否已授予此权限。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        if(!hasPermission()){
            startActivityForResult(
                    new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),
                    Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS);
        }
    }

如果没有启用,请要求用户启用:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS){
        if (!hasPermission()){
            startActivityForResult(
                    new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),
                    Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS);
        }
    }
}
private boolean hasPermission() {
    AppOpsManager appOps = (AppOpsManager)
            getSystemService(Context.APP_OPS_SERVICE);
    int mode = 0;
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.KITKAT) {
        mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
                android.os.Process.myUid(), getPackageName());
    }
    return mode == AppOpsManager.MODE_ALLOWED;
}

最后,这里有一个片段可以放在后台服务中,它可以提供当前前台活动的包名:

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private String getUsageStatsForegroundActivityName() {


    UsageStatsManager mUsageStatsManager = (UsageStatsManager) MyApplication.getInstance().getSystemService(Context.USAGE_STATS_SERVICE);
    long endTime = System.currentTimeMillis();
    long beginTime = endTime - 1000 * 60;

    // result
    String topActivity = null;

    // We get usage stats for the last minute
    List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, beginTime, endTime);

    // Sort the stats by the last time used
    if (stats != null) {
        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
        for (UsageStats usageStats : stats) {
            mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
        }
        if (mySortedMap != null && !mySortedMap.isEmpty()) {
            topActivity = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            logger.info("topActivity: " + topActivity);
        }
    }
    if (topActivity != null)
        return topActivity;
    else
        return Constant.ACTIVITY_NOT_FOUND;

}

如何使用 hasPermission()。 - Vishnu
我更新了我的回答并添加了 hasPermission() 方法。 - johnny_kb
你能贴出整个类吗?我从你的类中发现了一些错误,如 Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS - user3051460
请注意,用户需要在设备设置中的安全-> 应用程序-> 使用情况访问中提供使用权限。您知道如何自动打开此模式吗?如果未打开此设置,则您的代码将无法正常工作。 - user3051460

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接