Android屏幕鎖定詳解(一)

     相信手機屏幕的鎖定大夥熟悉吧?今天小馬就找個時間寫下對屏幕鎖的控制及學習,希望能幫助朋友們對屏幕鎖更加了解,以備不時之用,九宮格 PIN密碼 密碼鎖屏等的小馬會有屏幕鎖二中詳細介紹,大家看來看這篇簡單的,來熱熱身,先簡單講下下:

     之前在Android中,只能等到手機不使用規定時間或無操作時,手機會自動鎖定,解鎖用電源鍵對吧?現在好了,自從:API Level 8 (Android 2.2) 開始, Android提供了DevicePolicyManager類, 可以讓你的應用程序也能執行屏幕鎖定等操作,小馬以下程序中會用到的鎖定屏幕的操作類中要使用的對象有以下三個:

     現在三個類,小馬就不一一解釋,至於英語不好的朋友們,可以自行用工具查詢下里面出現的單詞,小馬英語一般能用工具查到的,你照樣可以,試下吧

     1.DevicePolicyManager

              Public interface for managing policies enforced on a device. Most clients

                  of this class must  have published a DeviceAdminReceiver that the user

                 has currently enabled.

     2.DeviceAdminReceiver

             Base class for implementing a device administration component. This class provides a

                convenience for interpreting the raw intent actions that are sent by the system.

     3.DeviceAdminInfo

           This class is used to specify meta information of a device administrator component.

 

再不懂的可以在網上查下,以下是小馬查到的,貼出來:

  

DevicePolicyManager

這是設備管理的主類。通過它可以實現屏幕鎖定、屏幕亮度調節、出廠設置等功能。

 

DeviceAdminReceiver

該類繼承自 BroadcastReceiver 。 從源碼可以看到,其實就是實現了一個OnReceive方法,該方法中根據不同的Action,執行相應的操作。 比如,如果激活成功,那麼Action就是ACTION_DEVICE_ADMIN_ENABLED, 據此調用 onEnabled 方法。

 

DeviceAdminInfo

包括設備信息,Info,就是Information嘛,呵,,亂猜也可以猜到,至於裏面什麼屬性,到時候朋友們可以直接"."下就知道啦。

 

  比如:

       DeviceAdminReceiver.USES_POLICY_FORCE_LOCK , 這個就是本次要用的"強制鎖定屏幕"的權限. 不過這些權限一般都直接通過XML文件來定義。 稍後你就會看到。

 

       Android手機中手機屏幕的鎖定方式有以下幾種 ,不文字描述了,直接上圖,看着爽

 

得瑟一下,今天剛升的4.0.3,吼吼,,帥。。。

以下是小馬拖的佈局,因爲只講功能,界面就不說什麼美觀不美觀了,拖三個按鈕,三個按鈕看按鈕上的的文本內容就知道是用在什麼地方的, 不多講,今天小馬先測試下系統鎖,因爲沒學會走呢,就先不去學跑了,大夥跟着小馬一起慢慢來,先從簡單的開始吧。

界面效果如下:

 

點擊第一個按鈕會跳到權限提醒頁面,如圖所示:

 

上面這個頁面只是提醒你你要激活的所有設備權限,點擊激活後會跳回首頁,再去點擊系統鎖使用時,就達到咱們的目的啦,吼吼。。如圖所示:

 

光看我做的效果可不行,大家別忘了在全局配置文件裏面配置,不然報錯的,添加以下代碼:

 

  1. <receiver 
  2.             android:name=".AdminReceiver" 
  3.             android:description="@string/description" 
  4.             android:label="@string/labelValue" 
  5.             android:permission="android.permission.BIND_DEVICE_ADMIN" 
  6.             > 
  7.              <meta-data  
  8.                 android:name="android.app.device_admin" 
  9.                 android:resource="@xml/lockourscreen"/> 
  10.             <intent-filter> 
  11.                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
  12.             </intent-filter> 
  13.              
  14.         </receiver> 

下面我貼出完整的代碼,供朋友們學習使用,有不懂之處,可直接提出疑問,我們共同交流:

主類:

  1. package com.xiaoma.www; 
  2.  
  3. import com.xiaoma.www.R; 
  4.  
  5. import android.app.Activity; 
  6. import android.app.admin.DevicePolicyManager; 
  7. import android.content.ComponentName; 
  8. import android.content.Context; 
  9. import android.content.Intent; 
  10. import android.os.Bundle; 
  11. import android.util.Log; 
  12. import android.view.View; 
  13. import android.view.View.OnClickListener; 
  14. import android.widget.Button; 
  15.  
  16.  
  17. /**   
  18. * @Title: DevicePolicyManagerDemoActivity.java 
  19. * @Package com.xiaoma.www 
  20. * @Description: 屏幕鎖測試 
  21. * @author MZH 
  22. * @version V2.2 
  23. */ 
  24. public class DevicePolicyManagerDemoActivity extends Activity { 
  25.      
  26.     private Button startPermissionBtn; 
  27.     private Button stopPermissionBtn; 
  28.     private Button sysLockBtn; 
  29.      
  30.     private DevicePolicyManager dpm; 
  31.     private ComponentName componentName ; 
  32.     /** Called when the activity is first created. */ 
  33.     @Override 
  34.     public void onCreate(Bundle savedInstanceState) { 
  35.         super.onCreate(savedInstanceState); 
  36.         setContentView(R.layout.main); 
  37.         //初始化 
  38.         init(); 
  39.     } 
  40.      
  41.     /** 
  42.      * 初始化實現 
  43.      */ 
  44.     private void init(){ 
  45.         //資源聲明定位 
  46.         startPermissionBtn = (Button)findViewById(R.id.button1); 
  47.         stopPermissionBtn = (Button)findViewById(R.id.button2); 
  48.         sysLockBtn = (Button)findViewById(R.id.button3); 
  49.          
  50.         startPermissionBtn.setOnClickListener(listener); 
  51.         stopPermissionBtn.setOnClickListener(listener); 
  52.         sysLockBtn.setOnClickListener(listener); 
  53.          
  54.         //取得系統服務 
  55.         dpm  = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE); 
  56.         componentName = new ComponentName(this, AdminReceiver.class); 
  57.          
  58.     } 
  59.      
  60.      
  61.     /** 
  62.      * 按鈕監聽器的實現,此處小馬講下,在實現監聽的時候不要在一個分支裏面寫太多邏輯處理 
  63.      * 分支只負責分支,不負責處理,要處理的話可以模塊化,處理函數抽出去就可以了 
  64.      * 小馬希望大家從一開始就養成個好習慣,吼吼。。 
  65.      */ 
  66.     private OnClickListener listener = new OnClickListener() { 
  67.         @Override 
  68.         public void onClick(View v) { 
  69.             //以下是三個按鈕分別處理的事件實現 
  70.             switch (v.getId()) { 
  71.             case R.id.button1: 
  72.                 //開啓設備權限 
  73.                 startDeviceManager(); 
  74.                 break
  75.             case R.id.button2: 
  76.                 //停止設備權限 
  77.                 stopDeviceManager(); 
  78.                 break
  79.             case R.id.button3: 
  80.                 //調用系統鎖 
  81.                 sysLock(); 
  82.                 break
  83.             default
  84.                 break
  85.             } 
  86.         } 
  87.     }; 
  88.      
  89.     /** 
  90.      * 啓動設備管理權限 
  91.      */ 
  92.     private void startDeviceManager(){ 
  93.         //添加一個隱式意圖,完成設備權限的添加  
  94.         //這個Intent (DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN)跳轉到 權限提醒頁面 
  95.         //並傳遞了兩個參數EXTRA_DEVICE_ADMIN 、 EXTRA_ADD_EXPLANATION 
  96.         Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); 
  97.          
  98.         //權限列表 
  99.         //EXTRA_DEVICE_ADMIN參數中說明了用到哪些權限,  
  100.         intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); 
  101.          
  102.         //描述(additional explanation) 
  103.         //EXTRA_ADD_EXPLANATION參數爲附加的說明 
  104.         intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "--小馬壞,小馬愛,小馬瓜瓜怪--"); 
  105.          
  106.         startActivityForResult(intent, 0); 
  107.          
  108.         } 
  109.      
  110.     /** 
  111.      * 禁用設備管理權限方法實現 
  112.      */ 
  113.     private void stopDeviceManager(){ 
  114.         Log.i("XiaoMaGuo","------ unActiveManage ------"); 
  115.         boolean active = dpm.isAdminActive(componentName); 
  116.         if (active) { 
  117.             dpm.removeActiveAdmin(componentName); 
  118.         } 
  119.     } 
  120.      
  121.     /** 
  122.      * 調用系統鎖方法實現 
  123.      */ 
  124.     private void sysLock(){ 
  125.         boolean active = dpm.isAdminActive(componentName); 
  126.         if (active) { 
  127.             dpm.lockNow(); 
  128.         } 
  129.     } 
  130.      

接收類:

 

  1. package com.xiaoma.www; 
  2.  
  3. import android.app.admin.DeviceAdminReceiver; 
  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.IBinder; 
  9. import android.util.Log; 
  10. import android.widget.Toast; 
  11. public class AdminReceiver extends DeviceAdminReceiver { 
  12.     @Override 
  13.     public DevicePolicyManager getManager(Context context) { 
  14.         Log.i("XiaoMaGuo""調用了getManager()方法"); 
  15.         return super.getManager(context); 
  16.     } 
  17.     @Override 
  18.     public ComponentName getWho(Context context) { 
  19.         Log.i("XiaoMaGuo""調用了getWho()方法"); 
  20.         return super.getWho(context); 
  21.     } 
  22.      
  23.     /** 
  24.      * 禁用 
  25.      */ 
  26.     @Override 
  27.     public void onDisabled(Context context, Intent intent) { 
  28.         Log.i("XiaoMaGuo""調用了onDisabled()方法"); 
  29.         Toast.makeText(context, "禁用設備管理", Toast.LENGTH_SHORT).show(); 
  30.          
  31.         super.onDisabled(context, intent); 
  32.     } 
  33.     @Override 
  34.     public CharSequence onDisableRequested(Context context, Intent intent) { 
  35.         Log.i("XiaoMaGuo""調用了onDisableRequested()方法"); 
  36.         return super.onDisableRequested(context, intent); 
  37.     } 
  38.      
  39.     /** 
  40.      * 激活 
  41.      */ 
  42.     @Override 
  43.     public void onEnabled(Context context, Intent intent) { 
  44.         Log.i("XiaoMaGuo""調用了onEnabled()方法"); 
  45.         Toast.makeText(context, "啓動設備管理", Toast.LENGTH_SHORT).show(); 
  46.          
  47.         super.onEnabled(context, intent); 
  48.     } 
  49.     @Override 
  50.     public void onPasswordChanged(Context context, Intent intent) { 
  51.         Log.i("XiaoMaGuo""調用了onPasswordChanged()方法"); 
  52.         super.onPasswordChanged(context, intent); 
  53.     } 
  54.     @Override 
  55.     public void onPasswordFailed(Context context, Intent intent) { 
  56.         Log.i("XiaoMaGuo""調用了onPasswordFailed()方法"); 
  57.         super.onPasswordFailed(context, intent); 
  58.     } 
  59.     @Override 
  60.     public void onPasswordSucceeded(Context context, Intent intent) { 
  61.         Log.i("XiaoMaGuo""調用了onPasswordSucceeded()方法"); 
  62.         super.onPasswordSucceeded(context, intent); 
  63.     } 
  64.     @Override 
  65.     public void onReceive(Context context, Intent intent) { 
  66.         Log.i("XiaoMaGuo""調用了onReceive()方法"); 
  67.         super.onReceive(context, intent); 
  68.     } 
  69.     @Override 
  70.     public IBinder peekService(Context myContext, Intent service) { 
  71.         Log.i("XiaoMaGuo""調用了peekService()方法"); 
  72.         return super.peekService(myContext, service); 
  73.     } 
  74.      

權限文件lockourscreen.xml:

  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <device-admin 
  3.   xmlns:android="http://schemas.android.com/apk/res/android"> 
  4.     <uses-policies> 
  5.         <!-- 強行鎖定 --> 
  6.         <force-lock /> 
  7.          
  8.         <!--  因爲今天我們只講下簡單的,所以其它的權限,小馬先暫時註釋掉咯,有興趣的朋友們可以打開自己試下--> 
  9.              <!-- 清除所有數據(恢復出廠設置)--> 
  10.              <wipe-data />  
  11.              <!-- 重置密碼 --> 
  12.              <reset-password /> 
  13.              <!-- 限制密碼選擇--> 
  14.              <limit-password />  
  15.              <!-- 監控登錄嘗試 --> 
  16.              <watch-login /> 
  17.          
  18.     </uses-policies> 
  19. </device-admin> 

全局配置文件:

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     package="com.xiaoma.www" 
  4.     android:versionCode="1" 
  5.     android:versionName="1.0" > 
  6.     <uses-sdk android:minSdkVersion="15" /> 
  7.  
  8.     <application 
  9.         android:icon="@drawable/ic_launcher" 
  10.         android:label="@string/app_name" > 
  11.         <activity 
  12.             android:name="com.xiaoma.www.DevicePolicyManagerDemoActivity" 
  13.             android:label="歡迎跟小馬一起交流學習" > 
  14.             <intent-filter> 
  15.                 <action android:name="android.intent.action.MAIN" /> 
  16.                 <category android:name="android.intent.category.LAUNCHER" /> 
  17.             </intent-filter> 
  18.         </activity> 
  19.          
  20.         <receiver 
  21.             android:name=".AdminReceiver" 
  22.             android:description="@string/description" 
  23.             android:label="@string/labelValue" 
  24.             android:permission="android.permission.BIND_DEVICE_ADMIN" 
  25.             > 
  26.              <meta-data  
  27.                 android:name="android.app.device_admin" 
  28.                 android:resource="@xml/lockourscreen"/> 
  29.             <intent-filter> 
  30.                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
  31.             </intent-filter> 
  32.              
  33.         </receiver> 
  34.     </application> 
  35.  
  36. </manifest> 

最後,如果朋友覺得看文章不痛快的,可以下載小馬上傳的附件,目的只有一個,共同交流,取得進步,謝謝啦,吼吼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章