一、目标
1、实现远程锁屏和数据销毁操作;
2、初步制作“一键锁屏”应用和优化。
二、代码实现
1、在Receiver包下新建一个类(取名LockScreenReceiver)继承DeviceAdminReceiver类(是BroadcastReceiver类的一个子类),并在清单配置文件配置receiver标签
(1)在receiver标签中,增加name、permission属性,name为新建类(LockScreenReceiver)的全路径名称,permission为必须的BIND_DEVICE_ADMIN权限;
(2)在receiver标签中增加 <meta-data>标签,在<meta-data>标签里增加name、resource属性,name值为"android.app.device_admin",resource值为@xml/device_admin_lockscreen(表示在res文件夹下的xml文件夹中的device_admin_lockscreen.xml文件,需新建)
(3)在res文件夹下新建文件夹(取名xml),在xml文件夹下新建文件(File)并取名为device_admin_lockscreen.xml,在device_admin_lockscreen.xml中拷贝如下代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
(4)在receiver标签中增加 <intent-filter>标签,设置其name属性值为action.DEVICE_ADMIN_ENABLED;
2、在com.example.mobilesafe.receiver包下的SMSReceiver类中,创建设备管理器(DevicePolicyManager)对象(取名dpm),
3、在SMSReceiver类的onReceive方法中,在需要进行“锁屏”操作的if语句(else if("#*lockscreen*#".equals(body)))里面,通过getSystemService(String name)方法实例化设备管理器(DevicePolicyManager)对象(dpm),参数name为DEVICE_POLICY_SERVICE,并强转,再调用其lockNow()方法实现锁屏(优化:判断应用程序在“设备管理器”中是否已激活,详见第8步);
4、另外可调用设备管理器(DevicePolicyManager)对象(dpm)的resetPassword(String password, int flags)设置解屏后的密码,参数String password为需要设置的密码,int flags为标签,可用0代替;wipeData(int flags)用于清除数据,当参数为0时表示恢复出厂设置,当参数为DevicePolicyManager.WIPE_EXTERNAL_STORAGE时表示格式化SD卡;
5、在手机(模拟器)的系统设置中,安全——>设备管理器,选中“手机卫士”(该信息可在第3步的(1)中的receiver标签属性中新增label、description两个属性以改变其显示内容),点击“激活”
(以上步骤可以实现“一键锁屏”的应用开发,后续是对“一键锁屏”应用的继续优化)
6、快速进入“设备管理器”激活界面。第4步中需要找到手机的“设备管理器”,并手动激活,使用起来较麻烦,因此可通过代码跳转至激活界面。
(1)可增加“激活设备管理器”按钮并设置点击事件;
(2)在点击事件代码中新建ComponentName对象(取名openDeviceAdmin),并通过new ComponentName(Context pkg, Class<?> cls)方法实例化,参数Context pkg为上下文、Class<?> cls为需要激活的类(此例中为继承了DeviceAdminReceiver类的类对象,即LockScreenReceiver.class);
(3)新建Intent对象,并通过Intent(String action)方法实例化,参数String action(动作名)为DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN,再通过Intent对象的putExtra(String name, Parcelable value)将相关额外数据传入,参数String name为DevicePolicyManager.EXTRA_DEVICE_ADMIN、Parcelable value为刚新建的ComponentName对象(openDeviceAdmin),再通过Intent对象的putExtra(String name, Parcelable value)将数据传入,此时参数String name为DevicePolicyManager.EXTRA_ADD_EXPLANATION、Parcelable value为关于激活设备管理器的描述信息;
(4)调用startActivity(Intent intent)方法启动并跳转至激活界面。
代码如下;
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 ComponentName openDeviceAdmin = new ComponentName(context, LockScreenReceiver.class); 2 Intent intentopenDeviceAdmin = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 3 intentopenDeviceAdmin.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,openDeviceAdmin); 4 intentopenDeviceAdmin.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "关于激活设备管理器的描述信息"); 5 startActivity(intentopenDeviceAdmin);
7、设置卸载“一键锁屏”按钮。由于激活的“设备管理器”在应用程序中无法卸载,因此可为其增加卸载按钮实现自动卸载,提高用户体验。
(1)可增加“卸载软件”按钮并设置点击事件;
(2)在点击事件代码中先取消激活“设备管理员”权限,使其成为普通应用:
①.新建ComponentName对象(取名openDeviceAdmin),并通过new ComponentName(Context pkg, Class<?> cls)方法实例化,参数Context pkg为上下文、Class<?> cls为需要激活的类(此例中为继承了DeviceAdminReceiver类的类对象,即LockScreenReceiver.class);
②.调用设备管理器(DevicePolicyManager)对象(dpm)的removeActiveAdmin(ComponentName who)取消激活ComponentName 对象所对应的类,此例中参数ComponentName who就是①中实例化的ComponentName对象(openDeviceAdmin);
(3)通过Intent对象卸载普通应用:
①.新建Intent对象并通过new Intent()实例化;
②.通过Intent对象的setAction(String action)方法增加动作,卸载程序的动作(即方法参数String action的值)为"android.intent.action.VIEW";
③.通过Intent对象的addCategory(String category)方法增加类别,参数String category值为"android.intent.category.DEFAULT"(默认);
④.通过Intent对象的setData(Uri data)方法增加想要卸载的程序路径,参数Uri data需通过Uri对象的parse(String uriString)方法将程序包全路径名称转成Uri对象,parse()方法的参数String uriString值为"package:"+应用程序包名(可通过getPackageName()获取包名))
⑤.调用startActivity(Intent intent)方法启动卸载程序,参数Intent intent为①中新建的Intent对象。
代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 Intent intent2 = new Intent(); 2 intent2.setAction("android.intent.action.VIEW"); 3 intent2.addCategory("android.intent.category.DEFAULT"); 4 intent2.setData(Uri.parse("package:"+context.getPackageName())); 5 startActivity(intent2);
8、优化:在锁屏前判断是否已经在“设备管理器”中激活应用,以防止出现程序崩溃现象
(1)调用设备管理器(DevicePolicyManager)对象(dpm)的isAdminActive(ComponentName who)方法判断程序是否已激活,参数ComponentName who同第7步(2)中的①;
(2)根据isAdminActive(方法)的返回值进行相应操作,若为true则执行锁屏,若为false则执行激活方法;