android应用锁之监听应用前后台切换方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 后备方式:

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

以上是关于android应用锁之监听应用前后台切换方式的主要内容,如果未能解决你的问题,请参考以下文章

Flutter如何监听应用事件:前后台切换横竖屏切换键盘显隐等

Flutter如何监听应用事件:前后台切换横竖屏切换键盘显隐等

Android前后台切换的监听

如何在 Android 应用程序后台监听音量键事件?

Android 监听APP进入后台或切换到前台方案对比

[FMX]将 Android 程序切换到后台及从后台切换到前台实现