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 ActionBarActivity12 {13     private DevicePolicyManager policyManager;14     private ComponentName componentName;15     private static final int MY_REQUEST_CODE = 9999;16 17     @Override18     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         else42         {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     @Override64     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         else73         {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         <activity10             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         <receiver18             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-data23                 android:name="android.app.device_admin"24                 android:resource="@layout/lock"/>25             <intent-filter>26                 <action27                     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句透明的应该也行,没试过)

至此,终于不再闪屏了……

更多相关文章

  1. Android动态权限管理
  2. Android(安卓)设备电池容量和使用量的获取
  3. android 获取文件的扩展名和去掉文件的扩展名
  4. Android中focusable属性的妙用——底层按钮的实现
  5. (转)Android_GPS
  6. 【Android】Android实现截取当前屏幕图片并保存至SDCard
  7. android获取内置和外置SD卡路径
  8. Android(安卓)8.0以上获取设备序列号解决方案
  9. 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度

随机推荐

  1. android中ADT和SDK的关系
  2. Android(安卓)Framework 之 SystemUI的启
  3. 对android:screenOrientation及android:c
  4. 新手android 开发 错误集锦(持续更新中)
  5. Ionic 简单操作
  6. Android(安卓)Service待机/睡眠时运行
  7. 使用SharedPreferences存储和读取数据
  8. Android(安卓)程序员指南 PDF下载
  9. android flutter 混合开发(配置篇)
  10. Android使用ContentProvider报异常(java.l