执行定时任务的方法:

1、使用Timer

package com.hjqjl.whdemo.feature.feature0.ui.activity;import android.content.Context;
import android.content.Intent;
import android.os.Bundle;import com.blankj.utilcode.util.ToastUtils;
import com.hjqjl.whdemo.R;
import com.hjqjl.whdemo.base.BaseActivity;import java.util.Timer;
import java.util.TimerTask;public class TimerActivity extends BaseActivity {public static void start(Context context) {Intent starter = new Intent(context, TimerActivity.class);context.startActivity(starter);}private Timer timer;private TimerTask task;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_timer);}@Overrideprotected void onStart() {super.onStart();startTimer();}@Overrideprotected void onStop() {super.onStop();stopTimer();}/*** 启动定时器*/public void startTimer() {if (timer == null) {timer = new Timer();}if (task != null) {task.cancel();}task = new TimerTask() {@Overridepublic void run() {//执行定时任务ToastUtils.showShort("执行定时任务Timer");}};if (timer != null) {timer.schedule(task, 3000, 60000);}}/*** 停止定时器 刷新上传数据*/private void stopTimer() {if (timer != null) {task.cancel();timer.cancel();timer.purge();timer = null;}}
}

2、使用ScheduledExecutorService

package com.hjqjl.whdemo.feature.feature0.ui.activity;import android.content.Context;
import android.content.Intent;
import android.os.Bundle;import com.blankj.utilcode.util.ToastUtils;
import com.hjqjl.whdemo.R;
import com.hjqjl.whdemo.base.BaseActivity;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class TimerActivity extends BaseActivity {public static void start(Context context) {Intent starter = new Intent(context, TimerActivity.class);context.startActivity(starter);}private ScheduledExecutorService exec;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_timer);}@Overrideprotected void onStart() {super.onStart();initTimer();}@Overrideprotected void onStop() {super.onStop();endExecutorScan();}private boolean isTimerRun = true;private void initTimer() {endExecutorScan();exec = Executors.newSingleThreadScheduledExecutor();//启动定时线程池if (exec != null) {exec.scheduleWithFixedDelay(new Runnable() {@Overridepublic void run() {if (isTimerRun) {//执行定时任务ToastUtils.showShort("执行定时任务ScheduledExecutorService");}}},3, 60, TimeUnit.SECONDS);}}private void endExecutorScan() {if (exec != null) {isTimerRun = false;exec.shutdownNow();}exec = null;//非单例模式,置空防止重复的任务}
}

3、倒计时按钮

实现如发送短信验证码等功能,通常需要倒计时功能,防止用户频繁按按钮发送短信。
效果如下:

import android.os.CountDownTimer;
import android.widget.Button;/*** 倒计时Button帮助类* 用法* CountDownButtonHelper countDownButtonHelper = new CountDownButtonHelper(smsBtn);* countDownButtonHelper.start();//开始* ----------------* countDownButtonHelper.cancel();//取消*/
public class CountDownButtonHelper {// 倒计时timerprivate CountDownTimer countDownTimer;// 计时结束的回调接口private OnFinishListener listener;private Button mButton;private String btnText;/*** @param button 需要显示倒计时的Button*/public CountDownButtonHelper(Button button) {this.mButton = button;// 由于CountDownTimer并不是准确计时,在onTick方法调用的时候,time会有1-10ms左右的误差,这会导致最后一秒不会调用onTick()// 因此,设置间隔的时候,默认减去了10ms,从而减去误差。// 经过以上的微调,最后一秒的显示时间会由于10ms延迟的积累,导致显示时间比1s长max*10ms的时间,其他时间的显示正常,总时间正常countDownTimer = new CountDownTimer(10 * 1000, 1 * 1000 - 10) {//倒计时的最大值10s;倒计时的间隔1s@Overridepublic void onTick(long time) {// 第一次调用会有1-10ms的误差,因此需要+15ms,防止第一个数不显示,第二个数显示2smButton.setText("(" + ((time + 15) / 1000) + "秒)");//Logger.d("time = " + (time) + " text = " + ((time + 15) / 1000));}@Overridepublic void onFinish() {mButton.setEnabled(true);if (btnText == null) {mButton.setText("验证码");} else {mButton.setText(btnText);//设置button上的文字}if (listener != null) {listener.finish();}}};}/*** 开始倒计时*/public void start() {mButton.setEnabled(false);countDownTimer.start();}/*** 关闭倒计时,一般onDestroy里会用到*/public void cancel() {if (countDownTimer != null) {countDownTimer.cancel();}}/*** 设置倒计时结束的监听器** @param listener*/public void setOnFinishListener(OnFinishListener listener) {this.listener = listener;}/*** 计时结束的回调接口(外部要调用所以用public)*/public interface OnFinishListener {void finish();}/*** 设置按钮里的文字*/public void setBtnText(String btnText) {this.btnText = btnText;}
}

在activity中的实现方法参考如下:

import android.content.Context;
import android.content.Intent;
import android.view.View;import com.hjqjl.whdemo.databinding.ActivityCountDownBinding;
import com.hjqjl.whdemo.utils.CountDownButtonHelper;
import com.hjqjl.whdemo.utils.ToastUtils;/*** 倒计时按钮*/
public class CountDownActivity extends BaseActivity {public static void actionStart(Context context) {Intent intent = new Intent(context, CountDownActivity.class);context.startActivity(intent);}private CountDownButtonHelper countDownButtonHelper;private ActivityCountDownBinding binding;@Overrideprotected void initData() {binding = ActivityCountDownBinding.inflate(getLayoutInflater());View view = binding.getRoot();setContentView(view);countDownButtonHelper = new CountDownButtonHelper(binding.btnCountDown);}@Overrideprotected void processLogic() {binding.btnCountDown.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {countDownButtonHelper.start();}});countDownButtonHelper.setOnFinishListener(new CountDownButtonHelper.OnFinishListener() {@Overridepublic void finish() {ToastUtils.showToast(mContext, "倒计时结束调用");}});}@Overrideprotected void onDestroy() {if (null != countDownButtonHelper) {countDownButtonHelper.cancel();}super.onDestroy();}
}

4、利用AlarmManager定时执行任务

需要用到广播

package com.apep.fivefive.utils;import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;import com.apep.fivefive.receiver.ReLaunchAppReceiver;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.TimeUtils;
import com.blankj.utilcode.util.ToastUtils;import java.util.Calendar;
import java.util.Random;
import java.util.TimeZone;/*** 2021/7/8 17:05 wh*/
public class ReLaunchAppUtils {public static void reLaunchApp(Context context, String msg) {ToastUtils.make().setTextSize(50).setDurationIsLong(true).show("" + msg);Intent intent = new Intent(context, ReLaunchAppReceiver.class);PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);//得到AlarmManager实例AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);am.set(AlarmManager.RTC, System.currentTimeMillis() + (1000 * 10), pi);//定时10s之后}/*** 凌晨一定时间内重启** @param context 上下文*/public static void reLaunchApp2(Context context) {//得到日历实例,主要是为了下面的获取时间Calendar mCalendar = Calendar.getInstance();mCalendar.setTimeInMillis(System.currentTimeMillis());// 这里时区需要设置一下,不然可能个别手机会有8个小时的时间差mCalendar.setTimeZone(TimeZone.getTimeZone("GMT+8"));//是设置日历的时间,主要是让日历的年月日和当前同步mCalendar.setTimeInMillis(System.currentTimeMillis());//设置在几点提醒  设置的为点int randomH = new Random().nextInt(4);mCalendar.set(Calendar.HOUR_OF_DAY, randomH);//设置在几分提醒  设置的为0分int randomM = new Random().nextInt(60);mCalendar.set(Calendar.MINUTE, randomM);//下面这两个看字面意思也知道int randomS = new Random().nextInt(60);mCalendar.set(Calendar.SECOND, randomS);//设置下一天mCalendar.add(Calendar.DAY_OF_MONTH, 1);//        ToastUtils.make().setTextSize(50).setDurationIsLong(true).show("" + msg);ReLaunchAppReceiver.class为广播接受者Intent intent = new Intent(context, ReLaunchAppReceiver.class);PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);//得到AlarmManager实例AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);LogUtils.v(TimeUtils.millis2String(mCalendar.getTimeInMillis()));//**********注意!!下面的三个根据实际需求任选其一即可*********/** 单次提醒 * RTC_WAKEUP 在设备关闭时唤醒设备。* RTC 此警报不会唤醒设备;如果它在设备睡眠时关闭,则直到设备下次醒来时才会发送。* mCalendar.getTimeInMillis() 上面设置的11点0分的时间点毫秒值*/am.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);/** 重复提醒* 第一个参数是警报类型;下面有介绍* 第二个参数网上说法不一,很多都是说的是延迟多少毫秒执行这个闹钟,但是我用的刷了MIUI的三星手机的实际效果是与单次提醒的参数一样,即设置的13点25分的时间点毫秒值* 第三个参数是重复周期,也就是下次提醒的间隔 毫秒值 我这里是一天后提醒*/
//        am.setRepeating(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), (1000 * 60 * 60 * 24), pi);/** 时间要求比set精准(耗能大)*/
//        am.setExact(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);}/*** 关闭定时*/private void stopRemind(Context context){Intent intent = new Intent(context, ReLaunchAppReceiver .class);PendingIntent pi = PendingIntent.getBroadcast(context, 0,intent, 0);AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);//取消警报am.cancel(pi);Toast.makeText(this, "关闭了提醒", Toast.LENGTH_SHORT).show();}
}

广播ReLaunchAppReceiver 不要忘记在AndroidManifest.xml中配置

public class ReLaunchAppReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//当系统到我们设定的时间点的时候会发送广播,执行这里LogUtils.e("ReLaunchReceiver");}
}

Android定时相关相关推荐

  1. Android Pmem相关介绍

    http://fangjian0518.blog.163.com/blog/#m=0 Android Pmem相关介绍 2011-10-18 09:40:26|  分类: Android PMEM | ...

  2. android定时循环,Android AlarmManager实现定时循环后台任务

    这篇文章使用AlarmManager实现了Android定时后台循环任务.使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息. AlarmManager简介 Alarm ...

  3. nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)

    from: http://wszf.net/archives/2012/11/07/80510.html 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16个分区(s ...

  4. android 内核内存管理,Android内核相关内容总结

    要想充分掌握Android这一操作系统的应用,首先需要我们从Android内核的相关内容开始了解.在这里就为大家详细介绍一下相关的知识. Android操作系统是由谷歌推出的一款基于Linux平台开源 ...

  5. Android 蓝牙相关的广播

    2019独角兽企业重金招聘Python工程师标准>>> Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和 ...

  6. android 定时闹钟逻辑,Android 定时执行任务 AlarmManager的使用(可用于闹钟开发)...

    Android 定时执行任务 AlarmManager的使用(可用于闹钟开发) 2011年7月13日加注:所有的定时任务在手机重启后会消失,如果需要重启后继续用,可以加个开机自启,然后重新设置. Al ...

  7. Android 指纹相关调研

    Android 指纹相关调研 背景:公司产品同学提出要接入指纹,用于登录场景,提高转化率,由于之前没接触过指纹,接下来就是指纹的相关调查. 一:指纹的优势 我们传统的登录方式,需要用户输入用户名和密码 ...

  8. 关于Android Launcher3相关优秀文章的记录

    关于Android Launcher3相关优秀文章的记录 Android M Launcher3主流程源码浅析 (主要分析主题流程,不涉及代码) Android Launcher3源码分析与修改 (偏 ...

  9. android蓝牙广播自定义,Android 蓝牙相关的广播

    Android 蓝牙相关的广播 监听蓝牙相关的广播并获得相关的信息,蓝牙相关的广播主要集中在BluetoothAdapter和BluetoothDevice类中, 可以通过在AndroidManife ...

最新文章

  1. AI领域内,敢和BAT决斗的创业公司都在这了!
  2. linux文件目录结构
  3. mysql数据库 sid_jdbc连接数据库使用sid和service_name的区别
  4. WinCE切换GPRS
  5. Comet4J推技术在SSHE三大框架中应用-linux下亲测可用
  6. Performance --- 前端性能监控
  7. java制作管理系统视频_阶段1:手把手快速做一个Java swing mysql学生信息管理系统附带完整源码及视频开发教程【猿来入此自营】...
  8. Tcl 语言 ——列表篇
  9. 电商平台如何快速对接物流模块
  10. 计算机网络知识总结与面经
  11. 取消mysql的salve设置
  12. NC65 用户密码重置
  13. 1.1 芯片研究背景及意义
  14. SA8155P QCOM 车载系统介绍
  15. 免费edu邮箱申请注册地址
  16. Android 问题:Installation failed due to: ‘Invalid File:
  17. Minima黑色响应式后台管理模板
  18. 图像卷积的常见误区与个人思考
  19. 遍历Python字典
  20. Linux基础bash命令

热门文章

  1. 2022年成都粘胶纤维产业申报条件、材料、流程
  2. jsoncpp中json字符串的格式化及非格式化转换
  3. 广西公需科目 当代科学技术前沿知识 考试答案
  4. 模拟电路设计(30)---数字滤波器简介
  5. macOS--使用Boot Camp安装双系统后win10下罗技鼠标蓝牙连接延迟(卡顿、不跟手)的解决办法
  6. Java中二维数组的动态初始化
  7. LPF: A Language-Prior Feedback Objective Function for De-biased Visual Question Answering 论文笔记
  8. 调用百度API 对文本进行情感倾向分析(舆情分析)
  9. python语言之父 是谁_Python之父与Python发展简史
  10. 快捷键FN+F6改为F6