永发信息网

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

答案:1  悬赏:50  手机版
解决时间 2021-01-26 13:17
怎么检测当前android界面是不是主屏
最佳答案
先说第一种方式:利用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 。。。("检测到特殊字符了")), 。。这些都是可变的条件。。所以也有

局限性,如果哪位看客有更好的方法不如给在下提示一下!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
现在的QQ浏览器怎么这么卡了
请分析说明下面小狗的部分生命现象各属于生物
火龙果是什么时节吃的?冬季适合吃火龙果吗?
成语十行俱下的意思是什么啊?有知道释义的请
华为荣耀3C忘记密码怎样重置?急
台山市斗山镇海扬家私商场地址好找么,我有些
在长6厘米,宽4厘米的长方形内画一个圆,这个圆
活性炭多久就要拿到外面去晒呢?
停用的干式变压器投入时有何管理规定
龙新商场地址好找么,我有些事要过去
三岁小孩经常晚上肚子痛是怎么了
工行储蓄卡,每年要交多少钱?
请问各位大师2008年2月5日下午15点出生的五行
【我们还是朋友】英语翻译:“我们还是朋友”
鸿雁国旅(商丘分公司)怎么去啊,我要去那办事
推荐资讯
章吉营子村怎么去啊,我要去那办事
大井村地址在什么地方,想过去办事
凯迪拉克ats-l和奔驰b200哪个好
阅读下列材料:材料一 贞观四年,(唐太宗)诏
魔兽火影2.3小鬼娱乐模式怎么卡飞
我国1月0度等温线经过(山脉)-- (河流)一
我刚买的苹果6为什么显示已过保修期,这是什
为什么我新买的iphone 7p微信和淘宝下载不了
土家腊排骨腌制比例
在某平面有三角形ABC,bc=24.A是动点,AC,AB的
Susu韩式半永久美妆地址在什么地方,想过去办
在尼泊尔购买的 iphone国内能用吗?价钱和国
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?