zoukankan      html  css  js  c++  java
  • android应用锁之监听应用前后台切换方式

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

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

     

    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. 后备方式:

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

     

    代码库:https://github.com/Vinzhuo/applock

  • 相关阅读:
    pip安装软件时出现Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build*的解决方案
    tidb安装
    TIDB 5.0 安装体验 怎么快速玩起来
    利用Tampermonkey(油猴)+ IDM 实现百度云盘大文件下载(IDM安装教程)
    python字典及相关操作
    【转载】CEO:我需要什么样的产品经理?
    2014年3月第三周/第一次跳槽、心情低潮期、与老总沟通问题
    hello word!
    function(event)中的event详解
    CSS 伪类
  • 原文地址:https://www.cnblogs.com/lzl-sml/p/5220795.html
Copyright © 2011-2022 走看看