安卓5.0以后获取顶层应用包名的方法(6.0,7.0,8.0均可用)

本文介绍在Android 5.0及以上版本中,由于getRunningAppProcesses方法被屏蔽,如何通过Context的usagestats服务获取当前顶层应用的包名。需在manifest中添加特定权限,并引导用户开启系统权限。提供了实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安卓5.0屏蔽了getRunningAppProcesses@ActivityManager方法,因此不能使用该方法完成获取顶层应用包名的需求。若要在5.0及以后的版本上获取顶层app的包名,可以使用Context的“usagestats”服务完成该需求。
但需注意以下几点:

  1. 有的手机厂商会屏蔽“usagestats”这一服务,据悉会有魅族、小米等厂商,但我的MX5上是可以正常获取的。
  2. 该服务需要在manifest中新增<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />这一权限
  3. 该服务需要获取系统的“有权查看使用情况的应用”这一权限,该权限需要用户手动开启,启动的Intent为:Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);

附上代码(该代码是从https://blog.youkuaiyun.com/dhl_1986/article/details/51305858 里获取的):

    public static String getTaskPackname(Context context) {
        String currentApp = "CurrentNULL";
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
            long time = System.currentTimeMillis();
            List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time);
            if (appList != null && appList.size() > 0) {
                SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                for (UsageStats usageStats : appList) {
                    mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
                }
                if (mySortedMap != null && !mySortedMap.isEmpty()) {
                    currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
                }
            }
        } else {
            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
            currentApp = tasks.get(0).processName;
        }
        Log.e("TAG", "Current App in foreground is: " + currentApp);
        return currentApp;
    }

转载于:https://blog.51cto.com/5052416/2149558

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值