获取当前系统的顶层的Activity(最后一种可以)

参考文章Android 如何监控当前Foreground Activity,如何获知应用程序的启动
提到的4种方式

  1. 使用 AccessibilityService
    需要监听事件TYPE_WINDOW_STATE_CHANGED, 然后根据这个事件解析出Activity的完整名字, 但是依赖的ClassName有时候和当前应用没有关系, 比如android.widget.FrameLayout, 导致PackageManager.NameNotFoundException, 从而失败. 测试手机小米Android11.
    代码自己搜吧, 网上一大把, 但是这种方式有问题

  2. 使用 ActivityManager
    如链接所言

在 Android5.0 (API-21)及以上,getRunningTasks将只返回自己和 launcher,getRunningTasks 无法正确判断当前应用是否为front, 不同版本测试的结果也不一样:

  1. 通过反射"android.app.ActivityThread"的方式获取Top Activity
    如链接所言

在有些手机上测试时,发现 It’s API > 19,只能获取当前App的Activities

  1. 通过 UsageStatsManager -> queryUsageStats方法获取Top Activity
    如链接所言
    确实能获取顶层Activity, 作者只给了获取包名的方法, 这里补上获取Activity名字的方法

public class PackageProcessUtil {
    
    private static final String TAG = PackageProcessUtil.class.getSimpleName();
    
    public static String getForegroundPackageName(Context context) {
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
            return null;
        }
        //Get the app record in the last minute
        Calendar calendar = Calendar.getInstance();
        final long end = calendar.getTimeInMillis();
        calendar.add(Calendar.HOUR_OF_DAY, -1);
        final long start = calendar.getTimeInMillis();
        
        UsageStatsManager usageStatsManager = null;
        usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        UsageEvents usageEvents = usageStatsManager.queryEvents(start, end);
        UsageEvents.Event event = new UsageEvents.Event();
        String packageName = null;
        while (usageEvents.hasNextEvent()) {
            usageEvents.getNextEvent(event);
            if (event.getEventType() == UsageEvents.Event.ACTIVITY_RESUMED) {
                packageName = event.getPackageName();
                Log.i(TAG, "event: " + JSONObject.toJSONString(event));
            }
        }
        Log.i(TAG, "getForegroundPackageName: " + packageName);
        return packageName;
    }
    
    public static String getApplicationNameByPackageName(Context context, String packageName) {
        PackageManager pm = context.getPackageManager();
        String appName;
        try {
            appName = pm.getApplicationLabel(pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA)).toString();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
            Log.e(TAG, "packageName: " + packageName);
            appName = "";
        }
        return appName;
    }
    
}

关注下面log的打印信息中的className字段, 获取当前的Activity, 包名, ActivityTask的根Activity, 记录的时间戳

Log.i(TAG, "event: " + JSONObject.toJSONString(event));

实际上日志非常多, 取决于代码设置统计时间区间

需要手动开启权限
小米手机(Android10)打开权限开关
设置->隐私保护->保护隐私->特殊应用权限->使用情况访问权限
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值