`
whao189
  • 浏览: 124926 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

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








分享到:
评论

相关推荐

    android 屏幕截图功能

    在Android应用开发过程中,有时我们需要实现屏幕截图的功能,例如在社交应用中分享当前界面的画面,或者在游戏应用中保存精彩瞬间等场景。本文将详细介绍如何在Android应用中实现屏幕截图功能。 #### 二、核心逻辑...

    Android板实现双屏显示,DisplayManager和Display的使用

    3. **检测附加屏幕**:在Android系统中,如果连接了外部显示器,`getDisplays()`方法会返回一个新的`Display`对象。我们可以遍历返回的`Display`数组,检查是否有新加入的显示设备。 4. **创建SurfaceView**:为每...

    Android-最简单的状态切换布局

    在Android开发中,状态切换布局是一个非常实用的设计模式,它能帮助开发者优雅地处理各种不同状态的显示,如数据加载中、数据加载失败、数据为空、网络错误等。"Android-最简单的状态切换布局"这一主题就是围绕如何...

    Presentation与自定义Dialog的使用

    在IT行业中,尤其是在Android或者Java应用开发中,`Presentation`和`自定义Dialog`是两个重要的概念,它们用于提供更好的用户界面和交互体验。本文将深入探讨这两个主题,并结合具体的编程实践来阐述如何使用它们。 ...

    ANDROID_KEYCODE.docx

    5. **KEYCODE_BACK** (返回键):键值为4,是Android中最常用的功能键之一,用于返回上一级界面或退出当前应用。 6. **KEYCODE_SEARCH** (搜索键):键值为84,通常用于启动设备上的搜索引擎或在当前应用中执行搜索...

    android50个技巧

    【Android 50个技巧】是为Android用户提供的实用指南,涵盖了从基础操作到高级功能的各种技巧,旨在帮助用户更好地理解和使用Android系统。以下是一些关键的技巧详解: 1. **电源管理Widget**:Android 2.1及更高...

    Android双屏异显车载视频播放器的设计.pdf

    在当前的智能车载系统中,Android平台因其强大的功能和灵活性,已经广泛应用于高端新能源客车的车载娱乐系统。本文主要探讨的是如何利用Android系统的双屏异显功能,设计一款低成本、高效能的车载视频播放器,以满足...

    Android自定义顶部导航栏控件实例代码

    在Android应用开发中,自定义顶部导航栏是一个常见的需求,它可以提供更加个性化和符合应用风格的界面元素。本文将详细讲解如何在Android中创建一个自定义的顶部导航栏控件,通过实例代码来阐述实现过程。 首先,...

    3、android系统使用手册[汇编].pdf

    手机桌面是Android设备的核心界面,用户可以自定义布局,添加或删除快捷方式,以及设置主屏壁纸。通过长按屏幕空白处,可以添加小部件、文件夹和快捷方式,提高操作效率。 二、壁纸设置 在“设置”&gt;“显示”&gt;“壁纸...

    盘点Android设备10个不为人熟悉的操作技巧

    Android设备作为当前非常流行的智能手机操作系统,拥有许多实用但不那么广为人知的操作技巧。掌握这些技巧,可以让用户在日常使用Android设备时更加高效便捷。 1. 快捷输入技巧:在Android设备上进行英文输入时,...

    android appwidget全面解析

    在深入探讨Android AppWidget之前,我们首先需要理解AppWidget在Android生态中的角色和价值。AppWidget,即桌面小部件,是Android系统提供的一种允许应用程序在主屏幕放置动态更新的组件,用户无需打开完整应用即可...

    十个小技巧让你的android手机更省电

    ### 十个小技巧让你的Android手机更省电 在快节奏的生活环境中,手机电量成为制约我们使用体验的重要因素之一。特别是在使用Android系统时,如何有效延长电池续航能力成为了许多用户关心的问题。以下介绍十个简单...

    Android Moveview滑屏移动视图类完整实例

    在Android应用开发中,用户界面的交互体验至关重要,滑屏效果就是其中一种常见的交互方式。本文将深入解析一个Android Moveview类,它专门用于实现主屏的左右滑动效果,并在滑动过程中实时反馈屏幕的变化状态。以下...

    11款Android平板浮窗多任务应用推荐.docx

    标题和描述中提到的是关于Android平板上的一些浮窗多任务应用的推荐,这些应用能够让用户在不离开当前界面的情况下,同时进行多个任务操作,提升工作效率和便利性。以下是这11款应用的详细介绍: 1. **Floating ...

    Android中home键和back键区别实例分析

    总的来说,Home键和Back键在Android中的角色是互补的,一个是让用户快速返回主屏,一个是帮助用户在应用内部进行导航。理解并适当地利用这两个键的特性,可以提升Android应用的用户体验。在编程时,应考虑到这两种键...

    时间小部件

    在Android开发领域,"时间小部件"是一种常见的应用组件,它允许用户在手机主屏幕上添加一个小型的时间显示,提供即时查看当前时间的功能。这个压缩包文件"TimeWidget"很可能包含了创建这样一个时间小部件所需的全部...

    高德导航 5.4.8828.0027

    【位置分享】:点击界面的当前点,选择通过短信方式分享位置,收信方无需网络即可打开导航快速锁定目标地点。 【问题反馈】:通过当前点的问题反馈,向我们发起求助, 我们将会帮您尽快将信息同步给救援单位。 下载-...

    可行性分析报告(跟据国家标准写作)

    当前用户需手动创建提醒事项,效率较低。 2. **工作负荷** 用户需花费较多时间手动管理短信中的事件提醒。 3. **费用开支** 目前无专门软件提供此类服务,因此无需额外费用。 4. **人员** 普通用户即可...

    HTCEVO3DG17水货手机使用教程借鉴.pdf

    返回键用于返回上一界面,菜单键展示当前屏幕的相关选项,主屏键返回待机主屏幕,搜索键则用于快速搜索。 2. **触摸屏操作**:使用电容式触摸屏时,应使用指腹而非指甲接触屏幕,包括屏幕下方的按键。首次开机时,...

    MTXTME常见问题问和答.ppt

    Android 2.1新增了动态壁纸、3D媒体库、智能节电模式、主屏数量从3个增加到5个,以及支持多点触控的Google地图。 9. **XT800版本升级方法** 可通过设置进行手动或自动升级:手动升级路径为“设置”-&gt;“关于手机”...

Global site tag (gtag.js) - Google Analytics