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

  • 相关阅读:
    RE
    【LeetCode】198. House Robber
    【LeetCode】053. Maximum Subarray
    【LeetCode】152. Maximum Product Subarray
    【LeetCode】238.Product of Array Except Self
    【LeetCode】042 Trapping Rain Water
    【LeetCode】011 Container With Most Water
    【LeetCode】004. Median of Two Sorted Arrays
    【LeetCode】454 4Sum II
    【LeetCode】259 3Sum Smaller
  • 原文地址:https://www.cnblogs.com/lzl-sml/p/5220795.html
Copyright © 2011-2022 走看看