DevStore一键锁屏源码学习

项目结构:


代码

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Windows上实现一键锁屏的功能,你可以使用以下方法之一: 1. 使用快捷键:你可以使用Windows键 + L的组合键来快速锁定屏幕。按下这个组合键后,你的电脑屏幕将立即锁定,并要求输入密码才能解锁。 2. 使用桌面快捷方式:你可以创建一个桌面快捷方式,以便通过点击它来实现一键锁屏的功能。创建桌面快捷方式的方法是:右键点击桌面空白处,选择“新建”-“快捷方式”-输入命令“rundll32.exe user32.dll,LockWorkStation”,然后点击“下一步”并将快捷方式命名为你喜欢的名称。创建完成后,你只需双击这个快捷方式,电脑屏幕就会立即锁定。 3. 使用自动锁屏功能:如果你想在离开电脑一段时间后自动锁屏,你可以使用以下方法之一: a. 通过屏幕保护程序:在Windows设置中,你可以设置屏幕保护程序,在一定时间没有操作后,屏幕保护程序会启动并锁定屏幕。你可以在“个性化”-“锁屏”-“屏幕保护程序设置”中进行设置。 b. 通过动态锁:如果你的电脑与手机配对,你可以使用动态锁功能。在Windows设置中,你可以设置动态锁来连接手机,当手机离开电脑超过一定距离时,电脑会立即锁定屏幕。你可以在“账户”-“登录选项”-“动态锁”中进行设置。 无论你选择哪种方法,一键锁屏可以帮助你在离开电脑时快速保护隐私。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Win10如何设置快速锁屏?电脑怎么设置离开锁屏?](https://blog.csdn.net/xitongzhijia_abc/article/details/125068417)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [电脑设置一键锁屏方法](https://blog.csdn.net/xitongzhijianet/article/details/125068952)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值