问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么检测当前android界面是不是主屏

发布网友 发布时间:2022-04-25 20:45

我来回答

1个回答

热心网友 时间:2022-06-17 06:30

先说第一种方式:利用ActivityManager,它系统级别的的服务,我之所以这么说是因为我

们是这样得到的。

Java代码
ActivityManager activityManager =
(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

然后我们可以看到API有这样一个方法,它是这么定义 和解释的:

Java代码
getRunningTasks(int maxNum)
Return a list of the tasks that are currently running, with the most recent being first and older ones after in order.

这个方法返回的是一个当前正在运行的任务集合,距离当前最近的第一个任务,任务在这个集

合中是有序的。距离当前最近的就是第一个任务,他的模式就和java栈一样,pop出来的就是

当前的!这个list 中包含的是对象是 RunningTaskInfo 从名字上就可以看出来这是一个

正在运行的任务的信息。它其中包含了这样一个属性baseActivity 他的描述是这样的

The component launched as the first activity in the task.

RunningTaskInfo.baseActivity 返回的是一个component。那么这句话的意思也就是

说 如果我们调用RunningTaskInfo.baseActivity 的这个方法 那么就会得要一个当前正

在运行的组件名称(它包含了当前组件的 包名 和 类名)。

ComponentName = RunningTaskInfo.baseActivity 。。这就是他要返回的对象,

然后看ComponentName 对象 他就包含了两个字段

Java代码
private final String mPackage;
private final String mClass;

一个就是包名,一个就是类名。那么我们需要就是在包名中检测这一个关键字"launcher",

你可能会问,为什么要检测这个关键字呢?其实我也思考了这个问题,我个人觉得这是跟系统

相关的,android系统主屏这个程序并不是我们应用开发工程师来做的,在做系统的时候他就

已经存在了,就行所有XP系统的 组策略一样,他的名字都是一样的。都叫gpedit.msc 。。

但是如果xp 系统是开源的你也可以修改组策略的名字叫 。。gped.msc。。。但是通常情况

下我们不这么干(况且微软这个老东西也不会开源的),那么所有android系统的 主屏这个程

序都位于launcher这个包中,尽管是开源的,但是大家貌似都不修改这个东西,如果说你硬

要修改它,那么你检测的时候就检测你修改后的包名吧!

它完整的程序如下:

Java代码
ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> tasks = activityManager.getRunningTasks(1);
boolean result = tasks.get(0).baseActivity.getPackageName().contains("launcher");

如果result 是 true 则就是说当期的那个界面在主屏!

但是请注意在清单文件中添加如下的权限 不然会抛出异常的

Java代码
<uses-permission android:name="android.permission.GET_TASKS"></uses-permission>

来看第二种方法:

通过日志输出来操作,因为第一种方法我们必须得知道主屏这个程序 位于那个包中,但是如

果某个厂商他修改了主屏这个程序的包名(毕竟android开源,说不定那个神经病会这么

干),我们在检测"launcher" 就可能检测不到。因此这种方法有一定的局限性,所以我们要

换一种思路,通过日志输出来监控!好吧,来看一下代码!

Java代码
java.lang.Process pro = Runtime.getRuntime().exec("logcat -c");
pro.waitFor();
pro = Runtime.getRuntime().exec("logcat XXX:D *:S");
BufferedReader reader = new BufferedReader(new InputStreamReader(pro.getInputStream()));

我们可以通过进程来调用logcat,然后监控logcat的输出。这是一个大体的思路,下面来细

细的解释一下。

先看Runtime.getRuntime().exec("logcat -c"); 。。如果熟悉命令的同学应该很快

能看懂,它是在调用logcat的清楚log 的命令类似于 window的 clear。。。这个东西!

然后我们让清除命令的进程等待,然后在调用Runtime.getRuntime().exec("logcat

XXX:D *:S");初看这一段貌似很难理解,我也是理解了好长时间(因为我也是新

手)。来详细的分析一下,我们得先对logcat 的命令有一个了解再说,logcat 的命令如下

-s:默认设置过滤器
-f:输出日志到文件
-c:清除日志
-d:获取日志
-g:获取日志的大小
-v:设置日志的格式

logcat -XXX:D *:S ...还是调用logcat这个东西 那么D 代表的就是说获取所有

的日志了 但是后面的"*" 号 怎么理解。。因为日志又分为级别(Info Warning Debug Error ) 所以 这个"*" 就是代表所有的日志信息不管什么级别的,但是-XXX 怎么

理解,其实这个地方就依赖于我们自己的测试机了。。因为我自己的测试机 需要这个东西 所

以得加上,换了一部机器有可能这个地方也得修改。在向下面看就是看reader.readLine().contains("你要检测的特殊字符")),通过分析日志的输出流来分析了,如果日志输出了。。"("检测到特殊字符了"就证明回到了主屏,但是每一部机器的日志输出可是不一样的哦。。也许你自

己的机器输出是"(没有检测特殊字符"),这个匹配符就得看你的操作系统的了。。。

到这里就已经完了,这两种方法有好有坏,第一种的话我们得熟悉操作系统中的主屏这个程序

的包名,而第二个就是通过JNI 调用了Linux命令。。但是他也有很多*,比如刚刚提到

的-XXX 。。。("检测到特殊字符了")), 。。这些都是可变的条件。。所以也有

局限性,如果哪位看客有更好的方法不如给在下提示一下!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请大家看看电脑配置怎么样,值多少钱,玩大型网游,页游会不会卡 帮忙看一下旧台式电脑能卖多少钱,谢谢 高考文科考了590,排名3455,福建的,想去外省的本一,能报哪里,急啊= = 华侨大学云南省高考分数为522的能从商学院转建筑学院吗? 厦门华侨大学录取 高考志愿填报应该注意哪些问题 成熟男人戴手表好看吗,成熟男人戴什么手表? 金铲铲之战金色神将阵容怎么搭-金铲铲之战金色神将阵容搭配攻略 金铲铲之战赌蜘蛛阵容推荐 蛛后主C装备搭配攻略 金铲铲之战仙灵蜘蛛阵容搭配推荐 android 获取所有正在运行的activity 怎么销毁指定的Activity Android 怎么退出整个应用程序 android 怎么判断应用开机是否启动了 如何判断栈里是否存在一个activity 判断app是否有activity baseactivity和activity的区别 Android开发extends BaseActivity中的baseactivity是什么 格式工厂如何将qsv转化成mp4 格式工厂怎么把qsv转换成mp4 格式工厂怎么将qsv转换成mp4 格式工厂怎么把qsv格式的视频转换成mp4 如何用格式工厂将qsv转换成mp4 汽车未来发展趋势如何? 汽车后市场未来有什么好的项目或者趋势 未来五至十年汽车后市场的发展趋势 汽车后市场具体包括哪些? 汽车以后的发展趋势是啥,谁知道? 汽车后市场服务发展趋势? 汽车后服务市场未来发展空间怎么样? 如何一次退出多个Activity android 怎么调用强制关闭 安卓怎样关闭Activity代码 怎样取消android 返回键的返回功能 如何监听android程序进入后台,和恢 安卓退出程序的方式代码怎么实现 ios app开发怎么实现状态栏颜色跟随标题栏颜色变化 上海水质硬吗?需要用软水机吗? 上海的自来水水质硬不硬? 上海水质硬度? 我的小米2S手机盒型号是2013012但进到手机用户手册是显示型号是2012061请问是不是正版机 上海的自来水是硬水还是软水? ”一般将水的硬度分为4个等级“,这个标准出处是哪里? 上海的水质是硬水还是软水? 我在上海和乐清二地生活,发现乐清地区的自来水很不容易把肥皂、洗洁精、沐浴露之类的东西,洗完后还是很滑 嘉定水质很硬 烧水有水垢 浦东没有水垢 是不是说明浦东的水比嘉定的好 西门子洗碗机应该设置上海的自来水硬度值多少 水质太硬怎么办? 水的硬度是多少,软水怎么形成 自来水是硬水吗?1500MG/KG的硬水是指什么?