在我的应用程序(设备管理员)中,当用户尝试停用应用程序的管理功能时,我需要擦除整个设备.当用户转到设置/安全/设备管理员并停用管理员应用程序时,首先会出现一个对话框"是否要取消激活".如果用户说"是",则会显示另一个小对话框,其中文本由应用程序的AdminReceiver在onDisableRequested()中提供.如果用户然后说"是",我想擦除整个设备.怎么做到这一点?
我尝试了一切,长期寻找答案,找不到真正的解决方案.
我尝试了什么:
官方文档没有明确说明,但似乎在调用onDisable()时管理员已被禁用.因此,我们必须在此之前擦除设备.
AdminReceiver有一个函数onDisableRequested(),它返回CharSequence.我试图在该功能中添加另一个警报框.这会崩溃,因为无法从非活动上下文调用警报框,这似乎是我们在onDisableRequested()时所拥有的.
AdminReceiver有一个onReceive()函数,可以在任何事件上调用它.在这个函数中,我们不再处于活动上下文中,也不能呈现我们自己的对话框.
我尝试从onReceive()创建另一个活动.这有效; 在onReceive()期间,当我们获得ACTION_DISABLE_ADMIN_REQUESTED时,管理员仍处于活动状态,我们可以擦除设备.但是,系统仍会显示自己的对话框,询问用户是否停用管理员.如果用户对我们的对话框拒绝但对系统对话框拒绝,则管理员将被停用,我们将无法擦除设备.
我在DeviceAdminReceiver的子类中尝试了以下内容:
@Override
public void onReceive(Context context, Intent intent) {
// detect whether disabling is requested?
if (intent.getAction().equals(ACTION_DEVICE_ADMIN_DISABLE_REQUESTED)) {
confirmWipeDevice(context);
} else {
super.onReceive(context, intent);
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,如果操作是禁用管理员,我不会调用super.onReceive().函数confirmWipeDevice()使用对话框显示不同的活动.这不显示用于确认禁用我的管理员应用程序的系统对话框.但是,这并不妨碍应用程序实际被禁用!
似乎Android系统执行以下操作:
将ACTION_DEVICE_ADMIN_DISABLE_REQUESTED发送到AdminReceiver
无论管理员应用程序想要执行什么操作,都要禁用管理员
如果用户取消禁用,则罚款; 如果没有,该应用程序被禁用.应用无法拒绝被禁用,也无法在禁用时执行设备擦除.
到目前为止,唯一的解决方案是在用户想要禁用管理应用时立即擦除而不进行确认.换句话说,我可以在onDisableRequested()中立即调用getManager().wipeData().那时,管理员仍然活跃,这是有效的.
它是否正确?当用户选择禁用管理应用程序时如何擦除设备?