1

我目前正在开发一个 Android 项目,该项目监控用户正在运行的应用程序,并使用设备内部存储的白名单交叉检查相应的进程。

为了完成这项工作,我需要知道设备的默认或系统进程是什么,以便将它们添加到白名单中。话虽如此,我有几个问题希望你能回答:

  1. 有没有办法区分必须运行的默认/系统进程和属于设备上的应用程序的进程?

  2. 是否有不同的默认/系统进程取决于用户正在运行的手机/android 版本?

  3. 如果是这样,这些进程名称是否可以在某个地方供开发人员使用?或者有没有其他方法可以获取它们?

如果我需要详细说明,请告诉我,感谢您的帮助。

4

2 回答 2

0

假设您尝试ActivityManagergetRunningAppProcesses(). 遍历该RunningAppProcessInfo对象数组并找到具有importanceof的对象IMPORTANCE_FOREGROUND。如果文档是正确的(还没有尝试过),那么应该只有一个进程IMPORTANCE_FOREGROUND——真正位于 UI 前台的进程。

(服务可以调用一个startForeground()方法来获得前台优先级,但我猜他们有IMPORTANCE_PERCEPTIBLE

然后,您可以检查该pkgList前台进程并将其与您的白名单进行比较。

但是,如果:

  • 异步弹出某些内容(闹钟应用程序、来电等)

  • 逻辑上在您的白名单中的应用程序具有影响其包名称的更改(例如,开发人员发布了一个学生付费的“专业”应用程序,而白名单只有免费应用程序)

  • 如果设备有多个可见项目(例如,三星的多窗口功能),如果不是所有可见应用IMPORTANCE_FOREGROUND

这至少摆脱了学生无法控制的纯背景内容的问题,包括您的“默认/系统进程”。

但是,它需要您不断轮询,这将严重损害电池寿命。加上对隐私的影响,对我来说,这意味着这个应用程序最多只能用于考试,并且应该是学生可以在考试前不久安装并在考试后不久删除的东西。

于 2013-02-15T01:31:05.133 回答
0

好吧,我认为我和我的团队已经提出了迄今为止最好的解决方案。在阅读了Android Docs之后,我们发现通过使用ActivityManager.getRunningServices()我们可以使用常量FLAG_SYSTEM_PROCESS来确定哪些进程是核心系统进程。然后我们要做的就是与正在运行的进程的总列表进行交叉检查以区分它们。

于 2013-02-21T20:25:56.217 回答