实现一键关闭屏幕的功能,需要获得系统服务DevicePolicyManager mDevicePolicyManager=(DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
通过这个DevicePolicyManager类,能够实现关闭屏幕功能,但需要获得设备管理权限。
关键代码如下:
mDevicePolicyManager=(DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
componentName=new ComponentName(this,yy.class);
if(!mDevicePolicyManager.isAdminActive(componentName)){
Intent intent=new Intent();
intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
startActivityForResult(intent,1);
}else{
mDevicePolicyManager.lockNow();
finish();
}
通过ComponentName来定义一个组件:
public class yy extends DeviceAdminReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
DeviceAdminReceiver又是什么呢?官方API解释的是“用于实现设备管理组件的基类”。
public class DeviceAdminReceiver
extends BroadcastReceiver
java.lang.Object | ||
↳ | android.content.BroadcastReceiver | |
↳ | android.app.admin.DeviceAdminReceiver |
可以看出实则是一个特殊的广播接收器(BroadcastReceiver),换句话说,只有注册了这个广播接收器,且使得这个广播接收器组件获得设备管理的权限,才有权利用DevicePolicyManager去管理设备。于是在Manifest文件中注册该广播接收器:
<receiver
android:name=".yy"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_DEVICE_ADMIN"> //必须声明的权限
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/policy"/>
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
</intent-filter>
</receiver>
上面代码的<meta-data>是通过指定的xml文件,把你所需要申请的设备管理权限告知给设备管理器。而这个特定的xml文件(/res/xml/policy.xml)类似于下面的代码:
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock /> <!--仅需该权限就能实现一键关屏-->
<wipe-data />
<expire-password />
<encrypted-storage />
<disable-camera />
<disable-keyguard-features />
</uses-policies>
</device-admin>
设备管理器是如何读取到你需要的<force-lock /> ?通过获得PackageItemInfo的子类ActivityInfo的类对象,该类对象中有一个Bundle字段metaData,该字段保存有相应组件的<meta-data>信息。获取组件的<meta-data>示例:
ActivityInfo ai=getPackageManager().getActivityInfo(new ComponentName(MainActivity.this,MainActivity.class), PackageManager.GET_META_DATA);
String name=ai.metaData.getString("这里是<meta-data>name属性对应的值");
注册好广播接收器后,需要申请设备管理权限啦,隐式Intent打开设备管理器注册活动:
Intent intent=new Intent();
intent.setAction(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,componentName);
startActivityForResult(intent,1);
激活为device administrator后,调用mDevicePolicyManager.lockNow( )关闭屏幕。
总结:首先注册一个继承DeviceAdminReceiver的广播接收器,并在该广播接收器的<meta-data>中指定需要的设备管理权限。在Activity中判断该广播接收器组件是否具有权限,若没有则进行注册,若有则直接关闭屏幕并finish。