实现屏幕休眠,类似于按下关机键
首先在AndroidManifest.xml文件中声明一个广播接受者
<pre name="code" class="java"> <receiver
android:name="cn.usst.LockScreen"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
在<meta-data>标签里定义了一个xml文件用来说明权限.
在/res目录下新建xml文件夹,新建名为device_admin的xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<device-admin
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<force-lock /><!--这里说明了锁屏的权限-->
</uses-policies>
</device-admin>
其他权限有 <wipe-data /> <!-- 清除所有数据(恢复出厂设置)-->
<reset-password /> <!-- 重置密码 -->
<limit-password /><!-- 限制密码选择-->
<watch-login /><!-- 监控登录尝试 -->
好了 配置到这就结束了,下面开始正片代码环节。
根据上面定义的一个广播接受者,我们先要创建一个名为LockScreen的类并且继承DeviceAdminReceiver(这是BroadReceiver的子类)
为了方便说明,我直接在LockScreen中创建了一个Activity类,并在AndroidManifest.xml中声明
<activity
android:name="cn.usst.LockScreen$Main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
好,下面来看LockScreen中的代码:
public class LockScreen extends DeviceAdminReceiver {
public static class Main extends Activity {// 这里声明了一个Activity类
private Intent service;// 用于启动服务
private DevicePolicyManager dpm;// 定义设备管理器
private ComponentName componentName;// 组建名称用来打开Activity或服务的
private Intent intent;
Button start, stop;// 定义两个按钮用于开启和关闭服务
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化
componentName = new ComponentName(this, LockScreen.class);
// 新建intent对象启动service服务
service = new Intent(this, ShackeLockService.class);
start = (Button) findViewById(R.id.open);
start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "开启", Toast.LENGTH_SHORT).show();
// 启动服务
startService(service);
}
});
stop = (Button) findViewById(R.id.close);
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this, "关闭", Toast.LENGTH_SHORT).show();
// 关闭服务
stopService(service);
}
});
<strong>// !!!!!!重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 首先获得设备管理器
dpm = (DevicePolicyManager) getSystemService("device_policy");
while (true) {
// 当当前服务没有被激活的时候
if (!dpm.isAdminActive(componentName)) {
getAdmin();
}
return;
}</strong>
}
<strong>private void getAdmin() {
// 添加锁屏权限,一定要添加不然会报错!!!!!
intent = new Intent("android.app.action.ADD_DEVICE_ADMIN");
intent.putExtra("android.app.extra.DEVICE_ADMIN", componentName);
intent.putExtra("android.app.extra.ADD_EXPLANATION",
"Additional text explaining why this needs to be added");
startActivity(intent);
}</strong>
}
}
在启动服务之后,我们注册了一个晃动监听器
@Override
public void onCreate() {
// TODO Auto-generated method stub
sensorManagerHelper = new SensorManagerHelper(getApplicationContext());
sensorManagerHelper.start();
}
在onSensorChanged()方法中,当检测到摇晃的时候添加锁屏代码:
<strong>// 得到设备管理器
DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService("device_policy");
// 锁屏
manager.lockNow();</strong>
然后当服务开启的时候,只要摇晃手机,屏幕就能自动锁屏