如何向DeviceAdminReceiver传递自定义Extra参数?
如何向DeviceAdminReceiver传递自定义Extra参数
首先得明确一个核心问题:Android系统在处理ACTION_ADD_DEVICE_ADMIN的激活流程时,不会将你添加到启动Intent里的自定义Extra传递给DeviceAdminReceiver的回调方法。当你启动激活界面后,系统会接管后续流程,用户完成激活操作后,系统会构造一个全新的广播Intent触发onEnabled回调,这个Intent里只会包含系统默认的参数,你自定义的"lock"参数自然就丢失了。
那该怎么传递自定义参数呢?这里有两个可靠的实用方案:
方案1:使用SharedPreferences临时存储参数
这是最常用也最稳妥的方法,在启动激活Intent前把参数存入SharedPreferences,在onEnabled回调里读取这个值,用完后清理掉避免影响后续逻辑。
修改启动激活的代码:
public static void goToActivateDeviceAdmin(Context context, ComponentName admin) { // 先把lock参数存入临时SharedPreferences SharedPreferences sp = context.getSharedPreferences("DeviceAdminTemp", Context.MODE_PRIVATE); sp.edit().putBoolean("lock", true).apply(); Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, Html.fromHtml(context.getString(R.string.admin_explain))); context.startActivity(intent); }
修改AdminReceiver的代码:
public static class AdminReceiver extends DeviceAdminReceiver { @Override public void onEnabled(Context context, Intent intent) { // 从SharedPreferences读取临时存储的lock参数 SharedPreferences sp = context.getSharedPreferences("DeviceAdminTemp", Context.MODE_PRIVATE); boolean needLock = sp.getBoolean("lock", false); if (needLock) { ((DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)).lockNow(); } // 用完后清理参数,避免下次触发时误用旧值 sp.edit().remove("lock").apply(); } }
方案2:使用自定义Application类的全局变量
如果你的应用有自定义的Application类,可以在里面设置一个临时变量来传递参数,适合简单场景:
自定义Application类:
public class MyApp extends Application { public boolean deviceAdminNeedLock = false; }
修改启动激活的代码:
public static void goToActivateDeviceAdmin(Context context, ComponentName admin) { // 给全局变量赋值 ((MyApp) context.getApplicationContext()).deviceAdminNeedLock = true; Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, Html.fromHtml(context.getString(R.string.admin_explain))); context.startActivity(intent); }
修改AdminReceiver的代码:
public static class AdminReceiver extends DeviceAdminReceiver { @Override public void onEnabled(Context context, Intent intent) { MyApp app = (MyApp) context.getApplicationContext(); if (app.deviceAdminNeedLock) { ((DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE)).lockNow(); // 重置参数,防止后续逻辑出错 app.deviceAdminNeedLock = false; } } }
小提醒
- 全局变量方案要注意进程回收问题:如果你的应用在激活过程中被系统回收重启,全局变量会丢失,这种情况下SharedPreferences的方案更可靠。
- 不管用哪种方案,记得在使用完参数后及时重置或清理,避免影响后续的设备管理员操作逻辑。
内容的提问来源于stack exchange,提问作者wgm
相关产品推荐
相关产品推荐

