DevStore一键锁屏源码学习

来源:互联网 发布:unity3d click 编辑:程序博客网 时间:2024/06/05 14:37

项目结构:


代码

MainActivity.java

package com.test.lockscreen;import com.test.lockscreen.LockReceiver;import android.os.Bundle;import android.app.Activity;import android.app.admin.DevicePolicyManager;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.view.Menu;public class MainActivity extends Activity {private DevicePolicyManager policyManager;//安卓的设备管理器private ComponentName componentName;//是用来打开其他应用程序中的Activity或服务的。    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);         componentName = new ComponentName(this, LockReceiver.class);        if (policyManager.isAdminActive(componentName)) {//判断是否有权限(激活了设备管理器)             policyManager.lockNow();// 直接锁屏        finish();        }else{             activeManager();//激活设备管理器获取权限             finish();        }     }        private void activeManager() {         //使用隐式意图调用系统方法来激活指定的设备管理器         Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);//这个是安卓隐藏的系统服务,用于锁屏的         intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);         intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "一键锁屏");         startActivity(intent);     } }

 

LockReceiver.java

package com.test.lockscreen;import android.app.admin.DeviceAdminReceiver;import android.content.Context;import android.content.Intent;public class LockReceiver extends DeviceAdminReceiver { @Override     public void onReceive(Context context, Intent intent) {         super.onReceive(context, intent);         System.out.println("onreceiver");     }        @Override     public void onEnabled(Context context, Intent intent) {         System.out.println("激活使用");         super.onEnabled(context, intent);     }        @Override     public void onDisabled(Context context, Intent intent) {         System.out.println("取消激活");         super.onDisabled(context, intent);     } }

 

 

AndroidManifest.xml

<receiver             android:name="com.test.lockscreen.LockReceiver"             android:description="@string/app_name"             android:label="@string/app_name"             android:permission="android.permission.BIND_DEVICE_ADMIN" >             <meta-data                 android:name="android.app.device_admin"                 android:resource="@xml/lock_screen" />                <intent-filter>                 <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />             </intent-filter>         </receiver>             </application>


 

/xml/lock_screen.xml

<?xml version="1.0" encoding="utf-8"?><device-admin xmlns:android="http://schemas.android.com/apk/res/android" >     <uses-policies>         <!-- 锁定屏幕 -->         <force-lock />     </uses-policies> </device-admin>

结果:

      运行这个程序,如果是首次进入则会判断是否有权限去通过软件锁屏,然后就会进入一个激活界面。

policyManager = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);         componentName = new ComponentName(this, LockReceiver.class);

激活界面就是通过Intent获取的componentName来跳转到receiver

Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);//这个是安卓隐藏的系统服务,用于锁屏的         intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName);         intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "一键锁屏");         startActivity(intent);

这里是还没有权限去锁屏时的代码,这里会跳转到一个receiver,这个receiver在AndroidManifest中配置了的,这个receiver中设置的比较简单,就是onEnabled(),onDisabled()两个方法,就是当这个receiver第一次用于设置是否可以锁屏时可以进入,然后就会调用这两个方法中的一个。

     

      但是如果已经有了锁屏的权限就会执行下面的代码,这段代码中调用了一个系统的锁屏函数lockNow(),所以这样就可以锁屏了。

if (policyManager.isAdminActive(componentName)) {//判断是否有权限(激活了设备管理器)             policyManager.lockNow();// 直接锁屏        finish();

可以看到右下角有一个一键锁屏的图标,点击这个图标就会执行锁屏。

policyManager.lockNow();// 直接锁屏        finish();

其实从这段代码中我们发现,这个程序是先锁屏后销毁,所以这个Activity在锁屏后还在,只不过由于销毁时间很短,所以我们没有发现。所以它执行过程是首先进入这个Activity,也是有布局的,然后执行锁屏,退出Activity。

 

 

重点记住的地方:

1. private DevicePolicyManager policyManager;//安卓的设备管理器

这是用于获取安卓设备的管理器。这里仅仅是用它来执行锁屏。

2. policyManager.isAdminActive(componentName)) {//判断是否有权限(激活了设备管理器)

 policyManager.lockNow();//直接锁屏

然后就是isAdminActive(),lockNow()这两个方法,第一个是用来判断是否有权限的,第二个是用来锁屏的,这两个都是系统函数。

 

3. publicclass LockReceiver extends DeviceAdminReceiver

还有就是观察下这个receiver,它集成了DeviceAdminReceiver这个系统的receiver,

public class

DeviceAdminReceiver

extends BroadcastReceiver

java.lang.Object

   

android.content.BroadcastReceiver

 

   

android.app.admin.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.

The callback methods, like the base BroadcastReceiver.onReceive() method, happen on the main thread of the process. Thus long running operations must be done on another thread. Note that because a receiver is done once returning from its receive function, such long-running operations should probably be done in aService.

When publishing your DeviceAdmin subclass as a receiver, it must handleACTION_DEVICE_ADMIN_ENABLED and require the BIND_DEVICE_ADMIN permission. A typical manifest entry would look like:

<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver" 
        android:label="@string/sample_device_admin" 
        android:description="@string/sample_device_admin_description" 
       
android:permission="android.permission.BIND_DEVICE_ADMIN"> 
    <meta-data android:name="android.app.device_admin" 
               android:resource="@xml/device_admin_sample" /> 
   
<intent-filter> 
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> 
    </intent-filter>
 
</receiver>

The meta-data referenced here provides addition information specific to the device administrator, as parsed by theDeviceAdminInfo class. A typical file would be:

<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> 
    <uses-policies> 
        <limit-password /> 
        <watch-login /> 
        <reset-password /> 
       
<force-lock /> 
        <wipe-data /> 
        <expire-password /> 
        <encrypted-storage /> 
        <disable-camera /> 
        <disable-keyguard-features /> 
    </uses-policies> 
</device-admin>

 


这是API中对这个类的解释,可以看到如果要继承这个类实现功能,必须要配置权限

android.permission.BIND_DEVICE_ADMIN

然后第二步是设置过滤器<intent-filter> 
        <action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/> 
    </intent-filter>

 

 

4,看API中下面的和项目里的/xml/lock_screen.xml很像,其实这就是配置了一个强制锁屏。

<device-adminxmlns:android="http://schemas.android.com/apk/res/android"> 
   
<uses-policies> 
        <limit-password /> 
        <watch-login /> 
        <reset-password /> 
        <force-lock/> 
       
<wipe-data/> 
       
<expire-password /> 
        <encrypted-storage /> 
        <disable-camera /> 
        <disable-keyguard-features /> 
    </uses-policies> 
</device-admin>

要配置上面这段文件是因为在AndroidManifest中配置了receiver的源数据,

<meta-data                 android:name="android.app.device_admin"                 android:resource="@xml/lock_screen"

这是配置的源数据的文件名称,这里我放在了xml文件夹下的lock_screen中,而API中放在了xml文件夹中的device_admin_sample文件中



PS:以上一键锁屏的源码来自于http://www.devstore.cn/code/list/pn1-or0.html ,需要源码的人可以从这里找到。

0 0
原创粉丝点击