Android定时锁屏功能实现(AlarmManager定时部分)

菜鸟入坑记——第一篇

关键字:AlarmManager

一、AlarmManager简介:

参考网址:https://www.jianshu.com/p/8a2ce9d02640
        参考网站:https://www.runoob.com/w3cnote/android-tutorial-alarmmanager.html

推荐此网址:https://www.jianshu.com/p/d69a90bc44c0

了解android低电耗模式:https://developer.android.google.cn/training/monitoring-device-state/doze-standby.html
        AlarmManager的作用:在特定的时刻为我们广播一个指定的Intent。
        即:自己设定一个时间,当系统时间到达此时间时,AlarmManager自动广播一个我们设定好的Intent,指向某个Activity或Service。
        注意:① AlarmManager主要用来在某个时刻运行你的代码,即使你的APP在那个特定的时间并没有运行。

二、获得AlarmManager实例对象:
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

三、方法:

setExact(int type, long startTime, PendingIntent pi); 一次性闹钟,执行时间精确,为精确闹钟

参数解释:此部分参考网站https://www.jianshu.com/p/8a2ce9d02640

四、程序设计:

(1)类型type

此处选用闹钟类型为AlarmManager.RTC:闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间(当前系统时间),状态值为1。

(2)开始时间startTime

由于通过SP获得的时间为String类型,需先转换为long类型,且时间单位为ms

 1 /**
 2      * String类型转换成date类型
 3      * strTime: 要转换的string类型的时间,
 4      * formatType: 要转换的格式yyyy-MM-dd HH:mm:ss
 5      * //yyyy年MM月dd日 HH时mm分ss秒,
 6      * strTime的时间格式必须要与formatType的时间格式相同
 7      */
 8     public static Date stringToDate(String strTime, String formatType){
 9         KLog.d("进入stringToDate");
10         try {
11             SimpleDateFormat formatter = new SimpleDateFormat(formatType);
12             Date date = null;
13             date = formatter.parse(strTime);
14             return date;
15         }catch (Exception e){
16             return null;
17         }
18     }
19     /**
20      * String类型转换为long类型
21      * .............................
22      * strTime为要转换的String类型时间
23      * formatType时间格式
24      * formatType格式为yyyy-MM-dd HH:mm:ss//yyyy年MM月dd日 HH时mm分ss秒
25      * strTime的时间格式和formatType的时间格式必须相同
26      */
27     public static long stringToLong (String strTime,String formatType){
28         KLog.d("进入stringToLong");
29         try{
30             //String类型转换为date类型
31             Date date = stringToDate(strTime, formatType);
32             Log.d(TAG,"调用stringToDate()获得的date:" + date);
33             if (date == null) {
34                 return 0;
35             }else {
36                 //date类型转成long类型
37                 long Hour = date.getHours();
38                 long Min = date.getMinutes();
39                 long TimeLong = Hour*60*60*1000 + Min*60*1000;
40                 Log.d(TAG,"stringToLong()获得的Hour:" + Hour + " h");
41                 Log.d(TAG,"stringToLong()获得的Min:" + Min + " min");
42                 Log.d(TAG,"stringToLong()获得的TimeLong:" + TimeLong + " ms");
43                 return TimeLong;
44             }
45         }catch (Exception e){
46             return 0;
47         }
48     }

Java Date、String、Long三种日期类型之间的相互转换

参考网址:http://www.blogjava.net/weishuangshuang/archive/2012/09/27/388712.html

成功获得睡眠时间(SLEEP_TIME)和起床时间(GET_UP_TIME)(单位ms)之后,计算锁屏时间IntervalTime(睡眠时间至起床时间):

1         //计算时间间隔
2         if (GET_UP_TIME >= SLEEP_TIME){
3              IntervalTime = GET_UP_TIME - SLEEP_TIME;
4         }else {
5              IntervalTime = 24*60*60*1000 + GET_UP_TIME - SLEEP_TIME;
6         }

(3)定义跳转Activity的操作:PendingIntent pi

我们的目的是利用AlarmManager的set()方法让闹钟在我们指定的时间点执行我们自定义的intent操作。这里时间点的设置非常重要,若时间设置的不精确(一般精确到秒即可,以下代码中精确至ms),将会导致闹钟执行intent有延迟。(SLEEP_TIME_HOUR和SLEEP_TIME_MIN分布是睡眠时间的小时数和分钟数)

 1 //设置当前的时间
 2 Calendar calendar = Calendar.getInstance();
 3 calendar.setTimeInMillis(System.currentTimeMillis());
 4 //根据用户选择的时间来设置Calender对象(即:睡觉时间)
 5 calendar.set(Calendar.HOUR_OF_DAY, (int)SLEEP_TIME_HOUR);
 6 calendar.set(Calendar.MINUTE, (int) SLEEP_TIME_MIN);
 7 calendar.set(Calendar.SECOND, 0);
 8 calendar.set(Calendar.MILLISECOND,0);
 9 //设置当前时区(若时区不对,闹钟将有偏差)
10 TimeZone timeZone = TimeZone.getDefault();//获取系统时间时区
11 KLog.d("当前设置的时区为: " + timeZone);
12 calendar.setTimeZone(timeZone);
13 KLog.d("睡觉时间:" + SLEEP_TIME + "ms, 起床时间:" + GET_UP_TIME + "ms.");
14 KLog.d("夜间休息时长:IntervalTime = " + IntervalTime + "ms.");

定义intent操作:

1         //定义用于跳转到 LockScreenActivity.class 中的Intent对象intent
2         Intent intent = new Intent(RobotClientMainActivity.this, LockScreenActivity.class);
3         intent.putExtra("INTERVAL", IntervalTime);

putExtra("INTERVAL", IntervalTime); "INTERVAL"为关键字,IntervalTime为传入值(此处指睡眠时锁屏的时间ms)。带值跳转至LockScreenActivity.class中,LockScreenActivity执行相应的锁屏操作。

初始化闹钟的执行操作pi:

PendingIntent.getActivity的使用:https://www.cnblogs.com/lyxin/p/5995681.html

1 //初始化闹钟的执行操作pi
2 pi = PendingIntent.getActivity(RobotClientMainActivity.this,0                     ,intent,PendingIntent.FLAG_UPDATE_CURRENT);

方法:PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags);

第一个参数是上下文context;

第二个参数是请求码,用于标识此PendingIntent的对象,相当于关键字;

第三个参数是意图,用于跳转Activity;

第四个参数代表了PendingIntent的四种不同的状态,可用理解为状态标识符。四种状态如下:

①FLAG_CANCEL_CURRENT:

如果当前系统中已经存在一个相同的PendingIntent对象,则已有的PendingIntent将会取消,然后重新生成一个PendingIntent对象。

②FLAG_NO_CREATE:

如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象,而是直接返回null。

③FLAG_ONE_SHOT:

该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用cancel()进行销毁,如果你再调用send()方法,系统将会返回一个SendIntentException。

④FLAG_UPDATE_CURRENT:

如果系统中有一个和你描述的PendingIntent对等的PendingIntent,那么系统将使用该PendingIntent对象,但是会使用新的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。

(4)设置alarmManager:

1 //定义AlarmManager对象
2     private AlarmManager alarmManager;
1         //初始化alarmManager
2         alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
1         /**
2          * 设置AlarmManager在Calendar对应的时间启动Activity
3          * 当到达睡觉时间时跳转至LockScreenActivity执行锁屏操作
4          */
5         alarmManager.setExact(AlarmManager.RTC,calendar.getTimeInMillis(),pi);
6         KLog.d("从calender中读取到的睡眠时间:" + calendar.getTime()
7                 + "/n 毫秒:"+calendar.getTimeInMillis());

在此处,系统已经能够在指定的时间跳转至锁屏操作。但是实践中出现的问题是:只要系统时间已经超过指定时间,关机重启时会自动跳入锁屏操作——为什么???。。。:(  。。。求大神指导

原文地址:https://www.cnblogs.com/ken9527just/p/11323529.html

时间: 2024-10-28 20:13:22

Android定时锁屏功能实现(AlarmManager定时部分)的相关文章

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 packag

Android中锁屏密码算法解析以及破解方案

一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机恶意样本.现在的锁机样本原理强制性太过于复杂,没意义.所以本文就先来介绍一下android中的锁屏密码算法原理. 二.锁屏密码方式 我们知道Android中现结单支持的锁屏密码主要有两种: 一种是手势密码,也就是我们常见的九宫格密码图 一种是输入密码,这个也分为PIN密码和复杂字符密码,而PIN密码

android一键锁屏

原文地址:http://www.fengfly.com/plus/view-209437-1.html 要用到下面两个类: DeviceAdminReceiver 设备管理组件.这个类提供了一个方便解释由系统发出的意图的动作.你的设备管理应用程序必须包含一个DeviceAdminReceiver的子类.本程序中,就代表一个手机上的设备管理器. DevicePolicyManager 一个管理设备上规范的类. 大多数客户端必须声明一个用户当前已经启用的DeviceAdminReceiver. 这个

iOS开发——使用技术OC篇&简单九宫格锁屏功能的实现与封装

简单九宫格锁屏功能的实现与封装 首先来看看最后的实现界面. 在这开始看下面的内容之前希望你能先大概思考活着回顾一下如果 你会怎么做,只要知道大概的思路就可以. 由于iphone5指纹解锁的实现是的这个功能呗淘汰,但是你可能会在想,都淘汰了你还在这里说个毛线啊,其实大家都知道,编程注重的思想,当然会了这个你不可能就会了指纹技术,哪还得等笔者在后面的学习中给大家分享,只是或许有一天这种功能或者思路在哪里要用到你不觉得是一件很开心的事情吗,而且如果你是不想自己敲的话直接可以拿来用. 好了不多废话直接上

一枚Android恶意锁屏程序分析

一枚Android恶意锁屏程序分析 [文章标题]:一枚Android恶意锁屏程序分析 [文章作者]: Ericky [作者博客]: http://blog.csdn.net/hk9259 [下载地址]: 由于恶意程序,不提供下载 [保护方式]: 无 [作者声明]: 本人水平有限,若有不足错误之处请指正 0x1软件界面: 0x2分析 反编译APK后得到APK类文件目录如下: 进入LockActivity定位到如下地方: 图中红色部分就是重置你的手机开机密码了. Mspmm就是设置的密码. Jb解密

CentOS取消屏幕保护自动锁屏功能(图形界面)

CentOS取消屏幕保护自动锁屏功能 1. 问题:默认启动屏幕保护 问题描述: CentOS系统在用户闲置一段时间(默认为5分钟)后,会启动屏幕保护程序(默认的屏保为黑屏),并要求重新输入密码才能回到原来桌面. 2. 解决方法:重新设置屏幕保护 2.1 打开Screensaver Preferences界面 2.2 取消屏幕保护的锁定功能 原文地址:http://blog.51cto.com/10085711/2068301

【Centos】Centos7.5取消自动锁屏功能

目录 00. 目录 01. 问题描述 02. 问题分析 03. 解决办法 04. 附录 00. 目录 @ 参考博客:[Centos]Centos7.5取消自动锁屏功能 01. 问题描述 Centos7.5系统在用户闲置一段时间(默认为5分钟)后,会启动屏幕保护程序(默认的屏保为黑屏),并要求重新输入密码才能回到原来桌面.如果是管理员,建议开启自动锁屏功能.如果是开发人员,可以关闭自动锁屏功能. 02. 问题分析 Centos7.5默认开启了自动锁屏功能,关闭自动锁屏功能即可. 03. 解决办法

Android开发之实现锁屏功能

锁屏需要引入设备超级管理员.在文档Android开发文档的Administration中有详细的说明.Android设备管理系统功能和控制访问. 主要有一下几个步骤: 1  创建广播接收者,实现DeviceAdminReceiver package com.andy.lockscreen; import android.app.admin.DeviceAdminReceiver; /** * @author Zhang,Tianyou * @version 2014年11月20日 下午9:51:

定时锁屏

CreateTime--2017年7月3日10:16:14Author:Marydon 设置间隔指定时间电脑自动锁屏 参考地址:电脑爱好者杂志 举例:实现每间隔45分钟,电脑自动锁屏 实现思路: 第一步:编写锁屏命令: 第二步:制定计划. 实践: 1.编写锁屏命令 新建一个txt文件,重命名为:lockScreen(名字随意)-->打开该文件添加内容:rundll32.exe user32.dll,LockWorkStation-->保存-->将该文件后缀名(扩展名)”txt“改为”ba