我目前正在开发一个Android项目,该项目监视用户正在运行的应用程序,并使用设备内部存储的白名单交叉检查相应的进程。
为了使这项工作,我需要知道设备的默认或系统进程是什么,所以我可以将它们添加到白名单。话虽如此,我有几个问题,我希望你能回答:
有没有办法区分必须运行的默认/系统进程和属于设备上应用程序的进程?
是否有不同的默认/系统进程,具体取决于用户运行的Android手机/版本?
如果是这样,这些流程名称是否可供开发人员使用?或者还有其他方法可以获得它们吗?
如果我需要详细说明,请告诉我,谢谢你的帮助。
答案 0 :(得分:0)
假设您尝试ActivityManager
和getRunningAppProcesses()
。迭代该RunningAppProcessInfo
个对象数组,找到importance
IMPORTANCE_FOREGROUND
的对象。如果文档是正确的(没有尝试过这个),那么应该只有一个进程IMPORTANCE_FOREGROUND
- 真正位于UI前景的进程。
(服务可以调用startForeground()
方法获取前台优先级,但我猜他们有IMPORTANCE_PERCEPTIBLE
)
然后,您可以检查该前台流程的pkgList
,并将其与您的白名单进行比较。
但是,如果出现以下情况,则会出现这种情况:
异步弹出的东西(闹钟应用,来电等)
逻辑上位于白名单中的应用程序会发生影响其程序包名称的更改(例如,开发人员发布了学生付费的“专业”应用程序,白名单只有免费应用程序)
如果设备有多个可见项目(例如,三星的多窗口功能),如果所有可见应用都不是IMPORTANCE_FOREGROUND
这至少解决了学生无法控制的纯背景问题,包括你的“默认/系统进程”。
但是,它需要您不断轮询,这将严重损害电池寿命。这加上隐私影响对我来说意味着这个应用程序最多只能用于考试,应该是学生可以在考试前不久安装并在考试后不久删除的东西。
答案 1 :(得分:0)
我认为我和我的团队到目前为止已经提出了最好的解决方案。阅读Android文档后,我们发现通过使用ActivityManager.getRunningServices()
,我们可以使用常量FLAG_SYSTEM_PROCESS
来确定哪些进程是核心系统进程。然后我们要做的就是用运行过程的总列表进行交叉检查,以区分它们。