一、概述
最近從應用市場下載了一款關閉手機屏幕的軟件,這款軟件很好的實現了關閉手機屏幕的功能,然而也加入了其他如連網,定位,
安裝包大小竟然到了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!