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文件中
- DevStore一键锁屏源码学习
- DevStore源码大赛:参赛之前来看看这些源码吧
- DevStore 十一月份资源精选
- DevStore-HTML5+jQuery
- ThinkAndroid框架-DevStore
- DevStore技术支持:AndEngine入门讲解
- DevStore技术支持:Android推送方案
- DevStore独家点评:腾讯信鸽推送服务
- DevStore-HTML5+jQuery\css\default.css
- DevStore-HTML5+jQuery\js\functions.js
- DevStore-HTML5+jQuery\js\jquery.js
- DevStore-HTML5+jQuery\js\garden.js
- devStore--移动互联各阶段相关资源
- 源码学习
- 源码学习
- 爱加密1周岁,DevStore发去贺电
- DevStore独家开放-智游推送开源安卓版SDK
- 开发者的狂欢 DevStore特约评测员选拔正式启动
- NotificationalLocal 本地推送
- PHP 设计模式 策略模式(Strategy)
- 淘宝联盟网站推广,验证域名失败
- Servlet(二)开发流程
- javafX8初探(分隔符)
- DevStore一键锁屏源码学习
- java学习--java多线程总结
- svc: failed to register lockdv1 RPC service (errno 111)解决和nfs配置
- perl特殊变量
- Java打jar包并运行实践
- insertFeatureClass的三种方式
- 使用花生棒穿透内网限制访问黑群辉NAS
- Magento创建CMS Page显示当前允许发货的国家名称,按字母排版.phtml文件
- iOS NSUserDefaults 简介