MyException - 我的异常网
当前位置:我的异常网» Android » 如何检测当前android界面是不是主屏

如何检测当前android界面是不是主屏

www.myexceptions.net  网友分享于:2013-06-27  浏览:38次
怎么检测当前android界面是不是主屏
前些天的需求,要求当用户的手机屏幕处于home主界面的时候,就在界面上做一些处理!

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

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


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

们是这样得到的。

ActivityManager activityManager = 
(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);


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

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 对象 他就包含了两个字段
    private final String mPackage;
    private final String mClass;

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

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

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

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

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

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

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

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

它完整的程序如下:

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 则就是说当期的那个界面在主屏!

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

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


来看第二种方法:

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

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

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

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

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 。。。("检测到特殊字符了")),  。。这些都是可变的条件。。所以也有

局限性,如果哪位看客有更好的方法不如给在下提示一下!在下先行谢过了








文章评论

5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
漫画:程序员的工作
漫画:程序员的工作
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
程序员必看的十大电影
程序员必看的十大电影
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
中美印日四国程序员比较
中美印日四国程序员比较
程序员的鄙视链
程序员的鄙视链
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
程序员都该阅读的书
程序员都该阅读的书
如何成为一名黑客
如何成为一名黑客
我是如何打败拖延症的
我是如何打败拖延症的
为什么程序员都是夜猫子
为什么程序员都是夜猫子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
代码女神横空出世
代码女神横空出世
老程序员的下场
老程序员的下场
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员和编码员之间的区别
程序员和编码员之间的区别
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
10个调试和排错的小建议
10个调试和排错的小建议
每天工作4小时的程序员
每天工作4小时的程序员
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
我的丈夫是个程序员
我的丈夫是个程序员
一个程序员的时间管理
一个程序员的时间管理
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
编程语言是女人
编程语言是女人
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有