项目结构:

代码

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或服务的。@Overrideprotected 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 ,需要源码的人可以从这里找到。

DevStore一键锁屏源码学习相关推荐

  1. Android一键锁屏源码

    APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: 1 package com.example.onek ...

  2. java 挂机锁屏 源码_一键锁屏 源码

    3.[文件] MainActivity.java ~ 2KB 下载(46) package com.feng.onekeylockscreen; import android.os.Bundle; i ...

  3. android 魔力锁屏源码,打造最炫手机锁屏桌面 10款安卓魔力锁屏主题推荐

    安卓魔力锁屏主题:个性情侣锁屏 这又是一款非常新潮的安卓魔力锁屏主题.锁屏界面上有一对情侣拿着手枪,界面展现方式与iPhone的非常相似.解锁方式采用的是屏幕下端横向拉动解锁. 安卓魔力锁屏主题:个性 ...

  4. android+锁屏代码+下载,安卓客户端开发的锁屏源码demo下载,可直接应用到APP中

    安卓程序锁屏 好多安卓APP中都用到锁屏技术在这里只是一个Demo 但是可以直接运用到已经做好的APP中,在绘制锁屏中用到许多的Math函数. package com.weiqiang.lockpoi ...

  5. mysql mdl 锁_MySQL源码学习:MDL字典锁

    什么是MDL MDL,Meta Data lock,元数据锁,一般称为字典锁.字典锁与数据锁相对应.字典锁是为了保护数据对象被改变,一般是一些DDL会对字典对象改变,如两个TX,TX1先查询表,然后T ...

  6. java 挂机锁屏 源码_挂机界面 - java代码库 - 云代码

    [java]代码库//挂机 package com.view; import java.awt.Color; /** * 挂机界面 * @author Administrator * */ publi ...

  7. 【拯救电源键】最详尽的android开发一键锁屏实例 提供免费源码+apk

    现在的手机屏幕越来越大,单手操控起来颇为不便,比如锁屏.电源键一般为实体键,经常按难免损耗.所以一键锁屏软件应运而生,既能方便地锁屏,还能减少电源键损耗.甚至许多手机厂商在自家的rom里集成了这个功能 ...

  8. 一键锁屏源代码c语言,Android一键锁屏开发全过程【源码】【附图】

    一.项目简介: 项目:<Android 一键锁屏> 开发周期:4天 代码量:100行 ------------------------ 二.项目流程: 三.项目代码 1.主程序代码: Ja ...

  9. Gh0st源码学习(二)去除硬盘锁和驱动

    一.去除硬盘锁   GH0st硬盘锁是源码的作者为了保护版权而设置的,如果我们直接更改版权会造成硬盘被锁   中了硬盘锁的后果是非常严重的,特别是你电脑里有重要数据的时候,这样会导致你电脑里的数据全部 ...

最新文章

  1. PHP中不被注意但是比较重要的函数用法集合
  2. Lambda表达式介绍
  3. UVA11174村民排队问题
  4. win7系统下配置openCV python环境附加 numpy +scipy安装
  5. C#并行编程(1):理解并行
  6. 微软发布Windows 11测试版开始菜单和任务栏等区域无响应的解决办法
  7. 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
  8. 做个环保主义的程序员
  9. 实时计算-多级订单金额,及下级人数
  10. lDEA报错Error: A JNI error has occurred, please check your installation and try again
  11. 第二章计算机组成原理例题,计算机组成原理习题第二章运算方法和运算器
  12. python调用通达信函数大全_python通达信公式函数,通达信软件公式函数SMA
  13. 4个终于被破译的世界级密码
  14. 网络工程师需要学c语言,网络工程师需要学哪些内容
  15. Java中double转String
  16. 视觉特效,图片转成漫画功能
  17. Beyond Compare 安装说明
  18. 什么是编码?什么是解码?为什么要编码.解码?
  19. /var/spool/postfix/maildrop占用空间大量处理
  20. 一枚研发狗的自我认知历程

热门文章

  1. 心理咨询真的会对我们起作用吗
  2. 20170114经济学人封面文章Lifelong Learning
  3. ARM cortex三个版本A,R, M之间区别
  4. 最新-自动化专业毕设题目选题推荐 - 单片机 嵌入式 stm32
  5. 取消Irp引起蓝屏(BugCheck:0x18)
  6. 如果你跳槽,你会选择什么行业,什么人
  7. Oracle数据库中常用的命令
  8. Pytorch_Geometric(PyG)使用DataLoader报错RuntimeError: Sizes of tensors must match except in dimension 0.
  9. 初识 MQTT——IBM
  10. 哈夫曼解压缩解压缩学习