原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝

公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现

PS:基于此原理,也可以实现自动检测并更新apk的功能

实现

实现的原理为:

1.进入APP,启动闹钟,设置一个闹钟服务(在某个时间点会触发任务),任务中其实主要是发出一个广播

2.设置广播接收器里的逻辑,其中包含清理数据和重新设置闹钟服务(即上述第一步)

之后即可一直循环,可以保证稳定执行

闹钟

设置一个闹钟服务,指定第二天的凌晨0:00:00开始触发任务

//构造一个PendingIntent对象(用于发送广播)
//注:ALARM_ACTION_CODE这个是action,后面需要匹配判断
String ALARM_ACTION_CODE = "ALARM_ACTION_CODE";
Intent intent = new Intent(ALARM_ACTION_CODE);
//适配8.0以上(不然没法发出广播)
if (DeviceUtils.getSDKVersionCode() > Build.VERSION_CODES.O) {
intent.setComponent(new ComponentName(this, DataDeleteReceiver.class));
}
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
1, intent,
PendingIntent.FLAG_CANCEL_CURRENT); //在第二天的0:00清理发出清理数据的广播
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DAY_OF_MONTH, 1); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); KLog.d("闹钟已启动,预定触发时间:" + TimeUtils.date2String(calendar.getTime()));

广播接收逻辑

直接通过Android Studio的菜单直接新建一个广播

enabledexported都勾选即可

当时间到点后,系统会发送一个广播,我们程序需要去接收此问题

public class DataDeleteReceiver extends BroadcastReceiver {

    @Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//匹配下之前定义的action
if ("ALARM_ACTION_CODE".equals(action)) {
KLog.d("-----定时清理数据-----");
//删除数据(需要开个子线程去操作) //这里重新设置定时器 //方便起见,这里我是跳转回MainActivity去重新执行了
EventBus.getDefault().post(new AlarmEvent()); }
}
}

补充——定时任务的8种方式

Java SDK:

  • while循环+sleep
  • 递归+sleep
  • Timer、TimerTask
  • ScheduledExecutorService(带有定时任务的线程池)

Android SDK:

  • Handler循环发消息
  • Handler的postDelayed方法
  • BroadcastReceiver循环自发广播
  • AlarmManger+BroadcastReceiver定时发送广播

参考

Android开发 定时任务清理数据的更多相关文章

  1. Android开发笔记之: 数据存储方式详解

    无论是神马平台,神马开发环境,神马软件程序,数据都是核心.对于开发平台来讲,如果对数据的存储有良好的支持,那么对应用程序的开发将会有很大的促进作用.总体的来讲,数据存储方式有三种:一个是文件,一个是数 ...

  2. Android开发-API指南-数据存储

    Storage Options 英文原文:http://developer.android.com/guide/topics/data/data-storage.html 采集日期:2015-02-0 ...

  3. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

  4. android开发系列之数据存储

    在我们的android实际开发过程,必不可少的一种行为操作对象就是数据.有些数据,对于用户而言是一次性的,这就要求我们每次进到App的时候,都需要去刷新数据.有些数据,对于用户而言又是具有一定时效性的 ...

  5. Android开发——获取应用数据/缓存大小并清理缓存

    1. 获取应用数据/缓存大小 其中pm为实例化的PackageManager,因为需要遍历所有的已安装的应用.因此需要开启子线程进行处理. 还有需要注意的是,在Android4.2之前getPacka ...

  6. Android开发手记(17) 数据存储二 文件存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...

  7. android开发之存储数据

    android数据存储之SharedPreferences 一:SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配 ...

  8. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  9. Android开发手记(20) 数据存储五 网络存储

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 安卓的网络存储比较简单,因为A ...

随机推荐

  1. React使用css module和className多类名设置

    引入样式文件 import styles from './footer.module.css'; 注意: 样式文件名必须要以.module.css结尾 单类名设置 <div className= ...

  2. 使用docker自定义oraclejdk启动jar包

    Dockerfile文件 FROM centos:7 #把java与tomcat添加到容器中 ADD jdk-8u161-linux-x64.tar.gz /usr/local/ #安装 vim编辑器 ...

  3. C/C++ byte 转 int 有符号数,转成Int 无符号数

    p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1); min-height: 14p ...

  4. C++之面试题(4)

    题目描述 来源:牛客网 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素. 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在 ...

  5. 【九度OJ】题目1138:进制转换 解题报告

    [九度OJ]题目1138:进制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1138 题目描述: 将一个长度最多为30 ...

  6. 【LeetCode】541. Reverse String II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  7. [LeetCode]621. Task Scheduler 任务安排 题解

    题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...

  8. Docker 与 K8S学习笔记(六)—— 容器的资源限制

    我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...

  9. Java调用Azkaban的RestFul接口

    1.绕过ssl认证的工具类: import java.security.KeyManagementException; import java.security.NoSuchAlgorithmExce ...

  10. 使用 Eclipse 创建一个静态的登录页面

    要求: 使用 Eclipse 创建一个静态的登录页面 实现步骤: 在 Eclipse 中,点击"File",显示菜单,选择"New" "Other&q ...