Android一鍵鎖屏源碼


APK下載

源程序下載

 

鎖屏流程如下(參考於Android一鍵鎖屏開發全過程【源碼】【附圖】

 

源碼參考於一鍵鎖屏 源碼

一共有2個Java文件:

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

 

 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 }
MainActivity.java

 

布局文件:

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>
activity_main.xml

 

這個是獲取權限時顯示的權限列表

 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>
lock.xml

 

修改原來的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>
styles.xml

 

配置文件

 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>
AndroidManifest.xml

 

一個Activity,打開來默認是顯示它的TitleBar(標題欄)的,而鎖屏的原理就是先打開Activity,再啟動鎖屏功能,最后把自己結束掉。

而最難的部分在於,當打開軟件的時候,該軟件會出現閃屏(閃現標題欄),然后才鎖屏。

一個比較好的解決方法是把該Activity設置為透明的,這樣即使出現標題欄也看不到。

網上大部分代碼是這樣解決的,在配置文件中,為Activity標簽添加一個屬性android:theme=@android:style/Theme.Translucent

但是由於我新建項目的時候為該項目選擇了系統自帶的主題(Theme.AppCompat.Light.DarkActionBar),所以配置文件中,Application標簽已經聲明了主題(見下圖),如果繼續在Activity中添加主題的話會運行出錯!

OK,那我把Application的主題刪了,只為Activity配置透明主題行了吧………………可是還是運行出錯!沒深入研究過Android,所以不知怎么會這樣……

 

最后磕磕碰碰,摸索出一個方法,修改Application的主題,添加下面2句(只添加1句透明的應該也行,沒試過)

 

至此,終於不再閃屏了……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM