鎖屏流程如下(參考於Android一鍵鎖屏開發全過程【源碼】【附圖】)
源碼參考於一鍵鎖屏 源碼
一共有2個Java文件:

1 package com.example.onekeylock.app; 2 3 import android.app.admin.DeviceAdminReceiver; 4 5 public class AdminReceiver extends DeviceAdminReceiver{}

1 package com.example.onekeylock.app; 2 3 import android.app.Activity; 4 import android.app.admin.DevicePolicyManager; 5 import android.content.ComponentName; 6 import android.content.Context; 7 import android.content.Intent; 8 import android.os.Bundle; 9 import android.support.v7.app.ActionBarActivity; 10 11 public class MainActivity extends ActionBarActivity 12 { 13 private DevicePolicyManager policyManager; 14 private ComponentName componentName; 15 private static final int MY_REQUEST_CODE = 9999; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) 19 { 20 super.onCreate(savedInstanceState); 21 //獲取設備管理服務 22 policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); 23 componentName = new ComponentName(this, AdminReceiver.class); 24 /* 25 * 假如先判斷是否有權限,如果沒有則調用activeManage(),然后立即鎖屏,再finish()。 26 * 這樣做是有問題的,因為activeManage()可能還在等待另一個Activity的結果,那么此時依然沒有權限卻 27 * 執行了lockNow(),這樣就出錯了。 28 * 處理方法有2個: 29 * 1、是重寫OnActivityResult()函數,在里面判斷是否獲取權限成功,是則鎖屏並finish() 30 * 否則繼續調用activeManage()獲取權限(這樣激活后立即鎖屏,效果很好) 31 * 2、不重寫OnActivityResult()函數,第一次獲取權限后不鎖屏而立即finish(),這樣從理論上說也可能 32 * 失敗,可能權限還沒獲取好就finish了(這樣激活后就回到桌面,還得再按一次鎖屏才能鎖) 33 * 綜上推薦第一種方法。*/ 34 35 //判斷是否有鎖屏權限,若有則立即鎖屏並結束自己,若沒有則獲取權限 36 if (policyManager.isAdminActive(componentName)) 37 { 38 policyManager.lockNow(); 39 finish(); 40 } 41 else 42 { 43 activeManage(); 44 } 45 setContentView(R.layout.activity_main); //把這句放在最后,這樣鎖屏的時候就不會跳出來(閃一下) 46 } 47 48 //獲取權限 49 private void activeManage() 50 { 51 // 啟動設備管理(隱式Intent) - 在AndroidManifest.xml中設定相應過濾器 52 Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 53 54 //權限列表 55 intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); 56 57 //描述(additional explanation) 58 intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "激活后才能使用鎖屏功能哦親^^"); 59 60 startActivityForResult(intent, MY_REQUEST_CODE); 61 } 62 63 @Override 64 protected void onActivityResult(int requestCode, int resultCode, Intent data) 65 { 66 //獲取權限成功,立即鎖屏並finish自己,否則繼續獲取權限 67 if (requestCode == MY_REQUEST_CODE && resultCode == Activity.RESULT_OK) 68 { 69 policyManager.lockNow(); 70 finish(); 71 } 72 else 73 { 74 activeManage(); 75 } 76 super.onActivityResult(requestCode, resultCode, data); 77 } 78 }
布局文件:

1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:layout_width="fill_parent" 3 android:layout_height="fill_parent"> 4 </RelativeLayout>
這個是獲取權限時顯示的權限列表

1 <?xml version="1.0" encoding="UTF-8"?> 2 <device-admin 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 <uses-policies> 7 <!--強制鎖屏--> 8 <force-lock/> 9 </uses-policies> 10 </device-admin>
修改原來的styles.xml

1 <resources> 2 <!-- Base application theme. --> 3 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 4 <!-- Customize your theme here. --> 5 <item name="android:windowNoTitle">true</item> 6 <item name="android:windowIsTranslucent">true</item> 7 </style> 8 </resources>
配置文件

1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.onekeylock.app"> 4 <application 5 android:allowBackup="true" 6 android:icon="@drawable/onekeylock" 7 android:label="@string/app_name" 8 android:theme="@style/AppTheme"> 9 <activity 10 android:name="com.example.onekeylock.app.MainActivity" 11 android:label="@string/app_name"> 12 <intent-filter> 13 <action android:name="android.intent.action.MAIN"/> 14 <category android:name="android.intent.category.LAUNCHER"/> 15 </intent-filter> 16 </activity> 17 <receiver 18 android:name=".AdminReceiver" 19 android:label="@string/app_name" 20 android:description="@string/app_name" 21 android:permission="android.permission.BIND_DEVICE_ADMIN"> 22 <meta-data 23 android:name="android.app.device_admin" 24 android:resource="@layout/lock"/> 25 <intent-filter> 26 <action 27 android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> 28 </intent-filter> 29 </receiver> 30 </application> 31 </manifest>
一個Activity,打開來默認是顯示它的TitleBar(標題欄)的,而鎖屏的原理就是先打開Activity,再啟動鎖屏功能,最后把自己結束掉。
而最難的部分在於,當打開軟件的時候,該軟件會出現閃屏(閃現標題欄),然后才鎖屏。
一個比較好的解決方法是把該Activity設置為透明的,這樣即使出現標題欄也看不到。
網上大部分代碼是這樣解決的,在配置文件中,為Activity標簽添加一個屬性android:theme=@android:style/Theme.Translucent
但是由於我新建項目的時候為該項目選擇了系統自帶的主題(Theme.AppCompat.Light.DarkActionBar),所以配置文件中,Application標簽已經聲明了主題(見下圖),如果繼續在Activity中添加主題的話會運行出錯!
OK,那我把Application的主題刪了,只為Activity配置透明主題行了吧………………可是還是運行出錯!沒深入研究過Android,所以不知怎么會這樣……
最后磕磕碰碰,摸索出一個方法,修改Application的主題,添加下面2句(只添加1句透明的應該也行,沒試過)
至此,終於不再閃屏了……