一、概述
最近从应用市场下载了一款关闭手机屏幕的软件,这款软件很好的实现了关闭手机屏幕的功能,然而也加入了其他如连网,定位,
安装包大小竟然到了3M,所以想动手自己写一个简单纯净的关屏软件。
二、开发
创建好新工程后,想到android应该有相关API,应该要用户授权之类的,然后结合从网上找到的资料和自己的总结,完成了开发。
1.首先,用户授权不是声明权限,而是激活自己的软件的锁屏功能,android把这个激活封装了一个activity,我们声明一个隐式意图跳到这个activity即可。而这个隐式意图是DeviceAdminReceiver这个广播的类对象,我们只需要创建一个广播继承即可,如下
package com.lzy.lockscreen;
import android.app.admin.DeviceAdminReceiver;
public class MyDeviceAdminReceiver extends DeviceAdminReceiver {
}
2.类中不需要任何代码,在Manifest文件中,声明如下
<receiver android:name=".MyDeviceAdminReceiver">
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/my_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
3.这里指定了一个xml文件my_admin,它的作用就是去列出自己需要激活的权限
<?xml version="1.0" encoding="utf-8"?>
<device-admin>
<uses-policies>
<force-lock />
</uses-policies>
</device-admin>
这里的force-lock就是关闭手机屏幕,还有这些激活,有兴趣的可以试一下,
limit-password 设置密码的规则
watch-login 监控屏幕解锁尝试次数
reset-password 更改屏幕解锁密码
force-lock 设备锁屏
wipe-data 删除全部的数据
4.然后就是写主activity的逻辑了,贴出代码吧
package com.lzy.lockscreen;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
DevicePolicyManager policyManager;
ComponentName componentName;
private TextView mTV;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTV = ((TextView) findViewById(R.id.tv));
mTV.setOnClickListener(this);
policyManager = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
componentName = new ComponentName(this, MyDeviceAdminReceiver.class);
if (!policyManager.isAdminActive(componentName)) {
goSetActivity();
} else {
systemLock();
}
}
private void goSetActivity() {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);
startActivityForResult(intent, 1);
}
/**
* 锁屏并关闭屏幕
*/
private void systemLock() {
if (policyManager.isAdminActive(componentName)) {
Window localWindow = getWindow();
WindowManager.LayoutParams localLayoutParams = localWindow.getAttributes();
localLayoutParams.screenBrightness = 0.05F;
localWindow.setAttributes(localLayoutParams);
policyManager.lockNow();
}
finish();
}
@Override
public void onClick(View view) {
if (view == mTV) {
goSetActivity();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (1 == requestCode) {
if (RESULT_OK == resultCode) {
systemLock();
} else if (RESULT_CANCELED == resultCode) {
//用户拒绝激活
}
}
}
}
大家可以看到仅仅60多行代码即可实现功能,有激活成功和失败的回调,交互友好,相信大家一看就明白,代码已经上传到github,地址:https://github.com/lzyang187/LockScreen
5.thks ,have a good time!