我不想做广告,但我的应用程序行为的示例应用程序是ESET防病毒软件。
我的应用程序的一个请求功能是卸载需要密码。我将我的应用程序添加到设备管理员列表,但现在无法卸载它。但是您可以将停用应用程序作为管理员设备。当您转到"设置">"位置和安全">选择设备管理员,然后尝试停用ESET Security,它将启动活动(我猜来自DeviceAdminReceiver.onDisableRequest()),该活动正在等待密码并且您的手机已锁定。主页按钮,后退按钮甚至关闭按钮都没有反应=>
主页,返回,关闭和相机按钮怎么可能没有反应?
编辑 - 删除第二个问题(在我从手机中取出电池后 - ESET 也不是设备管理员)
谢谢你的想法。
,对不起ESET,但这个功能看起来很有趣,所以我看了一下反编译的源代码:)
基本工作流程如下:
-
DeviceAdminReceiver
的com.eset.ems.antitheft.receiver.AdminReceiver
子类注册用于广播操作DEVICE_ADMIN_ENABLED
和DEVICE_ADMIN_DISABLED
- 禁用设备管理员时
com.eset.ems.antitheft.receiver.AdminReceiver.onDisabled()
调用 -
com.eset.ems.antitheft.LockActivity
从AdminReceiver.onDisabled()
开始 -
LockActivity
com.eset.ems.antitheft.LockingDialog
显示了最多阻塞魔法发生的地方
至于Home和其他按钮块防病毒软件做以下技巧 - 它使用来自Android内部的ActivityManagerNative。为了使LockActivity
保持在所有其他活动的顶部,它启动了一个线程,该线程使用LockActivity
任务ID持续调用ActivityManagerNative.moveTaskToFront()
。 在 API 级别 10 之前,反射用于访问 ActivityManager 类中的隐藏moveTaskToFront()
,在 API 10 之后,它仅使用 Android 代码库中的ActivityManagerNative
代码来访问它。此外,LockActivity
和LockingDialog
多次调用ActivityManagerNative.closeSystemDialogs()
方法。可能这样做是为了取消长按电源按钮后出现的系统对话框。
至于停止执行DeviceAdminReceiver.onDisableRequested
实际上我在代码中没有注意到它有什么特别之处。它仅在禁用设备管理员后启动活动,仅此而已。在我的手机上,我取出电池后,管理员被禁用。