打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
怎么检测当前android界面是不是主屏
前些天的需求,要求当用户的手机屏幕处于home主界面的时候,就在界面上做一些处理!

那么怎么才能检测到当前界面是不是主屏或者从其他的界面返回主屏了呢?

这里我说两种方式,不过这个小功能不是我实现的是我同事,呵呵。。。。在此要感谢他们了


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

们是这样得到的。

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


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

Java代码  
  1. getRunningTasks(int maxNum)   
  2. 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代码  
  1. private final String mPackage;  
  2. private final String mClass;  

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

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

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

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

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

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

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

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

它完整的程序如下:

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

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

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

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


来看第二种方法:

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

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

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

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

Java代码  
  1. java.lang.Process pro = Runtime.getRuntime().exec("logcat -c");  
  2. pro.waitFor();  
  3. pro = Runtime.getRuntime().exec("logcat XXX:D *:S");  
  4. 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 。。。("检测到特殊字符了")),  。。这些都是可变的条件。。所以也有

局限性,如果哪位看客有更好的方法不如给在下提示一下!在下先行谢过了
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
android的logcat详细用法 - arm
logcat使用
adb logcat 查看日志
Android系统的进程,任务,服务的信息
检测Activity是否在当前Task的栈顶
Reading and Writing Logs | Android Developers
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服