[Android] Android获取当前顶部Activity名方法历史版本汇总

在Android开发中,获取当前顶部Activity名受到版本限制。早期可通过ActivityManager的getRunningTasks方法,但在5.0后被限制。接着尝试使用UsageStatsManager获取Package名,但无法得到Activity名。通过StackOverflow上的建议,利用AccessibilityService监听窗口状态变化,成为一种可行方案,需要在AndroidManifest配置,并在 Accessibility 设置中启用服务。作者提供了实现此功能的开源项目CurrentActivity,GitHub链接为:https://github.com/Haocxx/CurrentActivity。
摘要由CSDN通过智能技术生成

在做一个显示当前顶部activity名和包名的ToolApp时遇到的问题。

在Android5.0之前,获取top Activity方法非常简单。直接使用getRunningTasks方法即可。

        //getRunningTasks() is deprecated since API Level 21 (Android 5.0)  
        List localList = manager.getRunningTasks(1);  
        ActivityManager.RunningTaskInfo localRunningTaskInfo = (ActivityManager.RunningTaskInfo)localList.get(0);  
        info.packageName = localRunningTaskInfo.topActivity.getPackageName();  
        info.topActivityName = localRunningTaskInfo.topActivity.getClassName();  

但是这个方法到了5.0就被Android因安全原因ban掉了。这之后使用该方法只能获取到Laucher的信息了。

后来有人找出了ActivityManger的一个方法:

private String getLollipopRecentTask() { 
    final int PROCESS_STATE_TOP = 2; 
    try { 
        Field processStateField = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState"); 
        List<ActivityManager.RunningAppProcessInfo> processes = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses(); 
        for (ActivityManager.RunningAppProcessInfo process : processes) { 
            if (process.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && process.importanceReasonCode == 0) { 
                int state = processStateField.getInt(process); 
                if (state == PROCESS_STATE_TOP) { 
                String[] packname = process.pkgList; 
                return packname[0]; 
                } 
            } 
        } 
    } catch (Exception e) { 
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值