Android手機通常不用時,都會經過電源鍵來鎖定屏幕同時關閉屏幕燈。java
鎖定效果:android
要讓本身的應用實現該屏幕鎖定,主要須要用到如下幾個類:DevicePolicyManager
這是設備管理的主類。經過它能夠實現屏幕鎖定、屏幕亮度調節、出廠設置等功能。app
DeviceAdminReceiver
該類繼承自 BroadcastReceiver 。 從源碼能夠看到,其實就是實現了一個OnReceive方法,該方法中根據不一樣的Action,執行相應的操做。 好比,若是激活成功,那麼Action就是ACTION_DEVICE_ADMIN_ENABLED, 據此調用 onEnabled 方法。ide
系統源碼:this
/** * Intercept standard device administrator broadcasts. Implementations * should not override this method; it is better to implement the * convenience callbacks for each action. */ @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_PASSWORD_CHANGED.equals(action)) { onPasswordChanged(context, intent); } else if (ACTION_PASSWORD_FAILED.equals(action)) { onPasswordFailed(context, intent); } else if (ACTION_PASSWORD_SUCCEEDED.equals(action)) { onPasswordSucceeded(context, intent); } else if (ACTION_DEVICE_ADMIN_ENABLED.equals(action)) { onEnabled(context, intent); } else if (ACTION_DEVICE_ADMIN_DISABLE_REQUESTED.equals(action)) { CharSequence res = onDisableRequested(context, intent); if (res != null) { Bundle extras = getResultExtras(true); extras.putCharSequence(EXTRA_DISABLE_WARNING, res); } } else if (ACTION_DEVICE_ADMIN_DISABLED.equals(action)) { onDisabled(context, intent); } }
具體中的簡單引用:spa
屏幕鎖定和恢復出廠設置
.net
1.建立 MyAdmin 的廣播接受者 繼承 DeviceAdminReceivercode
<receiver android:name=".MyAdmin"> <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>
my_admin.xmlcomponent
<?xml version="1.0" encoding="utf-8"?> <device-admin xmlns:android="http://schemas.android.com/apk/res/android"> <uses-policies> <limit-password /> <watch-login /> <reset-password /> <force-lock /> <wipe-data /> </uses-policies> </device-admin>
2.註冊廣播接受者爲admin設備orm
ComponentName mAdminName = new ComponentName(this, MyAdmin.class); if (mService != null) { if (!mService.isAdminActive(mAdminName)) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra (DevicePolicyManager.EXTRA_DEVICE_ADMIN,mAdminName); startActivity(intent); } }
3.獲取IDevicePolicyManager
public void lockScreen() { DevicePolicyManager dm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); ComponentName componentName = new ComponentName(this, MyDeviceAdmin.class); boolean isAdminActive = devicePolicyManager.isAdminActive(componentName); if(isAdminActive) //是否得到權限 { dm.resetPassword("123", 0); //滑動解鎖屏幕條後須要輸入密碼(方法中新設置的密碼)才能真正解鎖 dm.lockNow(); //dm.setMaximumTimeToLock(mDeviceComponentName, timeout); 相應時間後鎖屏 //恢復出廠設置. //dm.wipeData(0); }else{ //獲取管理員權限 Intent intent = new Intent( DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,mDeviceComponentName); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"這裏能夠輸入一些額外的說明,好比提示用戶什麼的"); startActivityForResult(intent, RESULT_ENABLE_LOCKVIEW); } } protected void onActivityResult(int paramInt1, int paramInt2, Intent paramIntent) { super.onActivityResult(paramInt1, paramInt2, paramIntent); DevicePolicyManager dm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE); ComponentName componentName = new ComponentName(this, MyDeviceAdmin.class); boolean isAdminActive = devicePolicyManager.isAdminActive(componentName); if (paramInt1 == RESULT_ENABLE_LOCKVIEW && isAdminActive) { lockScreen(); } else{ Toast.makeText(this, "激活失敗,沒法得到管理員權限", 1).show(); } }
4.MyDeviceAdmin
import android.app.admin.DeviceAdminReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.widget.Toast; public class MyDeviceAdmin extends DeviceAdminReceiver { public static String PREF_MAX_FAILED_PW; public static String PREF_PASSWORD_LENGTH; public static String PREF_PASSWORD_QUALITY = "password_quality"; static { PREF_PASSWORD_LENGTH = "password_length"; PREF_MAX_FAILED_PW = "max_failed_pw"; } public static SharedPreferences getDevicePreference(Context paramContext) { return paramContext.getSharedPreferences(DeviceAdminReceiver.class.getName(), 0); } public CharSequence onDisableRequested(Context paramContext, Intent paramIntent) { return "這是一個可選的消息,警告有關禁止用戶的請求"; } public void onDisabled(Context paramContext, Intent paramIntent) { showToast(paramContext, "設備管理:不可用"); } public void onEnabled(Context paramContext, Intent paramIntent) { showToast(paramContext, "設備管理:可用"); } public void onPasswordChanged(Context paramContext, Intent paramIntent) { showToast(paramContext, "設備管理:密碼己經改變"); } public void onPasswordExpiring(Context paramContext, Intent paramIntent) { showToast(paramContext, "設備管理:密碼過時"); super.onPasswordExpiring(paramContext, paramIntent); } public void onPasswordFailed(Context paramContext, Intent paramIntent) { showToast(paramContext, "設備管理:輸入密碼錯誤"); } public void onPasswordSucceeded(Context paramContext, Intent paramIntent) { } void showToast(Context paramContext, CharSequence paramCharSequence) { Toast.makeText(paramContext, paramCharSequence, 0).show(); } }
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/