写正题之前先闲扯几句。因为前段时间自己的手机电源键不灵,所以手机不能及时锁屏,一度让我很苦恼,后来通过在系统设置找到一个另类的方法,设置让音量键锁屏,最终也解决了问题,但是觉得还是不够爽,作为程序员,自己可以完全动手diy一个属于自己的锁屏程序啊 ,灵机一动,就自己查资料做了一个简单的锁屏demo.实现起来倒是不难,但是觉得还是有必要记录一下,如果能帮助到更多的人,何乐而不为呢。转入正题。
首先新建一个项目 项目名随便起了。
接着在主页的布局文件中加入一个按钮,这个按钮就是我们的锁屏按钮了 很简单,代码如下
<Button android:text="锁屏"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="lockScreen"/>
接着在MainActivity.java文件中实现上面button的点击时间回调方法lockScreen方法 ,当然目前就是一个空实现 如下,具体逻辑代码一会再补充
public void lockScreen(View view){
}
接下来创建一个空的广播接受者AdminManageReceiver.java 如下
import android.app.admin.DeviceAdminReceiver;
public class AdminManageReceiver extends DeviceAdminReceiver {
}
既然出现了广播 就应该第一时间在Manifest文件中注册,如下
<receiver
android:name=".AdminManageReceiver"
android:label="@string/app_name"
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>
注意这里的注册和别的广播注册有一个小的差别,注意红字部分。这里需要一个资源文件的支持,我们在res目录下面创建名为xml的文件夹,并在xml文件夹下面新建文件device_admin.xml文件。文件内容如下
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<force-lock />
</uses-policies>
</device-admin>
接下来最重要的操作就在MainActivity.java中完成。代码并不多。
MainActivity.java 代码如下
public class MainActivity extends ActionBarActivity {
ComponentName mAdminName;
DevicePolicyManager mDPM;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdminName = new ComponentName(this, AdminManageReceiver.class);
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
//如果设备管理器尚未激活,这里会启动一个激活设备管理器的Intent,具体的表现就是第一次打开程序时,手机会弹出激活设备管理器的提示,激活即可。
if (!mDPM.isAdminActive(mAdminName)) {
showAdminManagement(mAdminName);
}
}
//执行锁屏
public void lockScreen(View view){
if (mDPM.isAdminActive(mAdminName)) {
mDPM.lockNow();
}
}
//激活设备管理器
private void showAdminManagement(ComponentName mAdminName) {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "activity device");
startActivityForResult(intent,1);
}
}
注意:因为锁屏功能的实现需要激活设备管理器,所以第一次运行程序会出现如下激活设备管理器的界面。点击激活即可
DevicePolicyManager是一个和设备管理相关的类,他提供了很多与设备管理相关的方法,如resetPassword() 设置锁屏密码 wipeData() 恢复出厂设置/擦出手机数据 慎用!!等等,还有很多方法,可以查看文档DevciePolicyManager
注意:如果你想卸载这个锁屏程序,可能会出现卸载失败的情况,此时你只要在系统设置中找到对应的设备管理器程序(设备管理器的控制界面在不同的手机系统中位置是不一样的,在MIUI中可以通过 设置 -> 安全和隐私 -> 设备管理-> 设备管理器找到),然后取消激活这个程序,就可以执行正常的卸载了。