很久很久才发现,自己手机软件中没有自带一键锁屏的功能,害怕电源键寿命太短,于是就去市场下了一个解决这个需求,到最后发现这些软件中都有广告或者捆绑有插件,一怒之下就自己做了一个一键锁屏。其实感觉实现起来不是很困难,由于目前技术存在缺陷,还不不知道怎么更改Framwork层做到应用保活,目前跑在性能稍微差些的手机上第一次启动也就是冷启动的时候有点延迟,个人认为基本可以忽略不计,性能好的完全没有什么问题,感受不到。为了便于以后查看,特此写下实现过程。
一,我们首先写一个LockReceiver 继承DeviceAdminReciver,在这个类中我们什么也不用处理,打印日志就可以,然后在manifest中注册
public class LockReceiver extends DeviceAdminReceiver{ @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); System.out.println("onreceiver"); } @Override public void onEnabled(Context context, Intent intent) { System.out.println("激活使用"); super.onEnabled(context, intent); } @Override public void onDisabled(Context context, Intent intent) { System.out.println("取消激活"); super.onDisabled(context, intent); } }
再res文件中新建xml文件夹,然后新建lock_screen.xml文件
<device-admin xmlns:android="http://schemas.android.com/apk/res/android" > <uses-policies> <!-- 锁定屏幕 --> <force-lock /> </uses-policies> </device-admin>
manifest文件中注册
<receiver android:name=".LockReceiver" android:description="@string/app_name" android:label="@string/app_name" android:permission="android.permission.BIND_DEVICE_ADMIN" > <meta-data android:name="android.app.device_admin" android:resource="@xml/lock_screen" /> <intent-filter> <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> </intent-filter> </receiver>
二,然后在建一个LockActivity继承Activity处理相关逻辑,代码中已有详细注释
public class LockActivity extends AppCompatActivity { private DevicePolicyManager policyManager; private ComponentName componentName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); LockScreen(null); } public void LockScreen(View v) { //如果没有激活设备管理员,提醒用户做事 componentName = new ComponentName(this, LockReceiver.class); if (policyManager.isAdminActive(componentName)) {//判断是否有权限(激活了设备管理器) policyManager.lockNow();// 直接锁屏 finish(); // android.os.Process.killProcess(android.os.Process.myPid()); } else { activeManager();//激活设备管理器获取权限 this.finish(); } } // 解除绑定 public void Bind(View v) { if (componentName != null) { policyManager.removeActiveAdmin(componentName); activeManager(); } } //重写此方法用来在第一次激活设备管理器之后锁定屏幕 目前不起作用因为在打开activeManager进入设备管理器后finish掉了当前activity。 //导致调不到此方法所以第一次激活后不会锁屏。 @Override protected void onResume() { if (policyManager != null && policyManager.isAdminActive(componentName)) { policyManager.lockNow(); finish(); } super.onResume(); } private void activeManager() { //使用隐式意图调用系统方法来激活指定的设备管理器 Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "一键锁屏"); startActivity(intent); } }
按照以上不走基本可以实现一键锁屏了,但是存在一个问题,当每次点击应用是都会打开一个空白界面,然后再黑屏,所以我们得把界面变成透明,实现方法更改style样式:
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="android:windowNoTitle">true</item> <item name="android:windowIsTranslucent">true</item> </style> </resources>
然后再manifest使用该主题
android:theme="@style/AppTheme"至此一键锁屏功能已基本完成。