Android开发 定时任务清理数据
<p>原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝</p><blockquote>
<p>公司项目,需要整定时任务,对数据进行清理,<strong>需要在每天凌晨0:00进行数据的清理</strong>,使用了Alarm和广播的方式来实现</p>
</blockquote>
<p><strong>PS:基于此原理,也可以实现自动检测并更新apk的功能</strong></p>
<h2 id="实现">实现</h2>
<p>实现的原理为:<br>
1.进入APP,启动闹钟,设置一个闹钟服务(在某个时间点会触发任务),任务中其实主要是发出一个广播</p>
<p>2.设置广播接收器里的逻辑,其中包含清理数据和重新设置闹钟服务(即上述第一步)</p>
<p>之后即可一直循环,可以保证稳定执行</p>
<h3 id="闹钟">闹钟</h3>
<p>设置一个闹钟服务,指定第二天的凌晨0:00:00开始触发任务</p>
<pre><code>//构造一个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()));
</code></pre>
<h3 id="广播接收逻辑">广播接收逻辑</h3>
<p>直接通过Android Studio的菜单直接新建一个广播</p>
<p><img src="https://img2022.cnblogs.com/blog/1210268/202201/1210268-20220121141502849-1792721163.png" alt="" loading="lazy"></p>
<p><code>enabled</code>和<code>exported</code>都勾选即可</p>
<p>当时间到点后,系统会发送一个广播,我们程序需要去接收此问题</p>
<pre><code>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());
}
}
}
</code></pre>
<h2 id="补充定时任务的8种方式">补充——定时任务的8种方式</h2>
<p><strong>Java SDK:</strong></p>
<ul>
<li>while循环+sleep</li>
<li>递归+sleep</li>
<li>Timer、TimerTask</li>
<li>ScheduledExecutorService(带有定时任务的线程池)</li>
</ul>
<p><strong>Android SDK:</strong></p>
<ul>
<li>Handler循环发消息</li>
<li>Handler的postDelayed方法</li>
<li>BroadcastReceiver循环自发广播</li>
<li>AlarmManger+BroadcastReceiver定时发送广播</li>
</ul>
<h2 id="参考">参考</h2>
<ul>
<li>Android Manager之AlarmManager(闹钟服务)_听海的博客-CSDN博客_android 闹钟</li>
<li>Android 定时任务的8种实现方法 - 简书</li>
<li>10.5 AlarmManager(闹钟服务) | 菜鸟教程</li>
</ul>
</div>
<div id="MySignature" role="contentinfo">
<hr>
<span>提问之前,请先看</span>提问须知
<span>点击右侧图标发起提问</span>
<img border="0" src="http://wpa.qq.com/pa?p=2:1053894518:52" alt="联系我" title="联系我">
<span>或者加入QQ群一起学习</span>
<img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="Stars-One安卓学习交流群" title="Stars-One安卓学习交流群">
TornadoFx学习交流群:1071184701
<img src="https://img2020.cnblogs.com/blog/1210268/202003/1210268-20200316120825333-1551152974.png" width="1000" height="auto">
<img src="https://img2018.cnblogs.com/blog/1210268/201905/1210268-20190508151523126-971809604.gif" width="1000" height="auto">
<!--<img src="https://img2020.cnblogs.com/blog/1210268/202004/1210268-20200413161422035-1188549898.gif" width="1000" height="auto">--><br><br>
来源:https://www.cnblogs.com/stars-one/p/15830108.html
頁:
[1]