• Android一键锁屏源码


    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 ActionBarActivity
    12 {
    13     private DevicePolicyManager policyManager;
    14     private ComponentName componentName;
    15     private static final int MY_REQUEST_CODE = 9999;
    16 
    17     @Override
    18     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         else
    42         {
    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     @Override
    64     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         else
    73         {
    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         <activity
    10             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         <receiver
    18             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-data
    23                 android:name="android.app.device_admin"
    24                 android:resource="@layout/lock"/>
    25             <intent-filter>
    26                 <action
    27                     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句透明的应该也行,没试过)

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

  • 相关阅读:
    Spring MVC系列之Hello World(SpringBoot)(六)
    SpringBoot系列之注解@Autowired VS @Qualifier VS @Primary(五)
    SpringBoot系列之注解@Component VS @Bean(四)
    SpringBoot系列之@PropertySource和@Value注解(二)
    SpringBoot系列之入门篇(一)
    不要叫我,我会叫你(控制反转原理)
    EntityFramework Core 3多次Include导致查询性能低之解决方案
    EntityFramework Core 3.0查询
    Java入门系列之集合HashMap源码分析(十四)
    浅析性能测试策略及适用场景
  • 原文地址:https://www.cnblogs.com/chenyg32/p/3719714.html
Copyright © 2020-2023  润新知