中易网

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

答案:1  悬赏:10  
解决时间 2021-01-16 02:09
  • 提问者网友:星軌
  • 2021-01-15 10:16
怎么检测当前android界面是不是主屏
最佳答案
  • 二级知识专家网友:不甚了了
  • 2021-01-15 10:26
先说第一种方式:利用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 tasks = activityManager.getRunningTasks(1);
boolean result = tasks.get(0).baseActivity.getPackageName().contains("launcher");

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

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

Java代码


来看第二种方法:

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

果某个厂商他修改了主屏这个程序的包名(毕竟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 。。。("检测到特殊字符了")), 。。这些都是可变的条件。。所以也有

局限性,如果哪位看客有更好的方法不如给在下提示一下!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息