今天在做技术总结,顺便就把知识共享,个人崇尚分享。

通过以下方式来监听是不是发生了应用的前后台切换:

1. android api 10 – 15

通过ActivityManager registerActivityWatcher方法注册IActivityWatcher的方式监听。

2. android api 16 – 20

通过监听/dev/log/events文件内容变化来监听应用切换变化。

为什么这个方式能成功监听:

因为/dev/log/events是内核的日志输出字符设备终端文件。

通过查看logger.h(linux内核日志输出系统)发现定义了:

定义/dev/log/events日志输出设备文件

通过查看logcat.cpp源码我们会发现:

他的readLogLines(log_device_t * devices)函数

通过select方式一直监听内核日志的输出,然后在输出到屏幕终端,所以我们可以在terminal中输入adb locat看到系统日志输出如下:我点击短信app

看看readLogLines 函数中log_device_t创建:

为啥要使用这种方式来监听:

因为android api16-20中使用了IActivitContorller或IProcessObserver来代替IActivityWatcher,但是这种方式只能监听自己的activity切换,监听别的应用需要系统权限。

3. android api 21及以上:

通过监听bg_non_interactive/tasks文件内容变化来监听应用切换变化。

为什么这种方式能监听成功

这当然是系统设计时留下来的一个漏洞,当app发生前后台切换时,他的pid会相应的在bg_non_interactive/tasks中增加或删除

  为啥要使用这种方式来监听:

因为/dev/log/events不能在用户态进行监听,看logcat的源码没有选择直接监听,还是通过logger提供的接口去内核态进行监听

4. 其他辅助监听方式:

监听相应的/proc/pid/oom_adj值得变化来监听前后切换

5. 后备方式:

通过轮询来获取应用切换变化(耗电量大,暂时没有使用)

android应用锁之监听应用前后台切换方式的更多相关文章

  1. Android Back Home键监听

    Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...

  2. Android EditText截获与监听输入事件

      Android EditText截获与监听输入事件共有2种方法: 1.第一种方法:使用setOnKeyListener(),不过这种方式只能监听硬键盘事件. edittext.setOnKeyLi ...

  3. iOS开发——锁屏监听

    公司所做的项目,锁屏监听是为了60秒后,解锁瓶后显示[手势解锁]或[指纹验证]: 第一步:AppDelegate.m 头部导入 #import <notify.h> #define Not ...

  4. Android对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17761431),请尊重他人的辛勤劳动成果,谢谢! 我之前写 ...

  5. Android addTextChangedListener(文本监听)参数解释及实现EditText字数监听

    由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher.它有三个成员方法,第一个after很简单,这个方法就是在EditT ...

  6. Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换

    在上一篇博客,Android-Activity临时数据的保存,中讲解到,当发生横竖屏切换的时候,系统会杀死Activity并重新启动Activity 系统会杀死Activity 12-12 08:11 ...

  7. extjs组件添加事件监听的三种方式

    extjs对组件添加监听的三种方式  在定义组件的配置时设置 如代码中所示:  Java代码  xtype : 'textarea',  name : 'dataSetField',  labelSe ...

  8. android事件处理之基于监听

    Android提供了了两种事件处理方式:基于回调和基于监听. 基于监听: 监听涉及事件源,事件,事件监听器.用注册监听器的方法将某个监听器注册到事件源上,就可以对发生在事件源上的时间进行监听. 最简单 ...

  9. Android 对电话进行监听和挂断

    1.添加权限 <!--拨打电话的权限--><uses-permission android:name="android.permission.PROCESS_OUTGOIN ...

随机推荐

  1. 协程并发框架gevent及其用法

    gevent是python的一个并发框架,采用协程实现并发目的,用起来也非常简单 gevent的docs:http://www.gevent.org/contents.html 一个最简单的例子: i ...

  2. maven记录

    1. 跳过测试 mvn  -Dmaven.test.skip=true 2. 依赖树 mvn dependency:tree 3. 生成UTF-8的eclipse工程 构成目录中的.settings文 ...

  3. 【转】apache/php 开启 gzip压缩

    1.php方式开启 原理: header("Content-Encoding: gzip"); echo gzencode('songjiankang'); 示例1: functi ...

  4. 用"僵尸对象"调试内存管理问题

    Cocoa提供了"僵尸对象"(Zombie Object)这个功能.启用这项调试功能之后,运行时系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回 ...

  5. RDIFramework.NET ━ 9.3 用户管理 ━ Web部分

    RDIFramework.NET ━ .NET快速信息化系统开发框架 9.3  用户管理 -Web部分 用户管理模块主要是对可登录系统的用户进行管理.后续的工作如:用户归属角色.权限的分配.用户所拥有 ...

  6. 使用inherit属性值继承其父元素样式来覆盖UA自带样式。

    像button.input这样的表单控件,不同的浏览器都会有自己的样式风格(UA样式).我们可以使用inherit继承其父元素样式,从而覆盖浏览器的UA样式. button, input, selec ...

  7. Control Flow

    1.重写折半查找,使得在循环内部只执行一次测试 传统的非递归式的折半查找的例子中,while循环语句内部共执行了两次测试,其实只要一次就足够(代价是将更多的测试在循环外执行).重写该函数,使得在循环内 ...

  8. IPC

    IPC,全名Inter Process Communication即进程间通讯,在同一台机器上的两个进程就用IPC,不能跨物理机器。IPC包括共享内存、队列、信号量等几种方式,由于IPC通讯效率之高, ...

  9. [Zend]设置ZendStudio编辑器配色

    首先,菜单栏–help–install new software… 接着,添加一个更新源,就是点击界面的add按钮,在新窗口的location位置输入http://eclipse-color-them ...

  10. mvn 配置修改

    http://www.cnblogs.com/geektown/p/5705405.html D:\javaInstall\apache-maven-3.3.9-bin\apache-maven-3. ...