android倒计时封装(活动进入后台,倒计时依然能正常计时)
16lz
2022-04-20
效果图:
封装好的工具类:TimeUtils.java
package com.xiao7.pump.Utils;import android.os.Handler;import android.os.Message;import android.widget.TextView;import java.util.Timer;import java.util.TimerTask;public class TimeUtils { /*倒计时时长 单位:秒*/ public static int COUNT = 20*60; /*当前做*/ private static int CURR_COUNT = 0; /*预计结束的时间*/ private static long TIME_END = 0; /*计时器*/ private static Timer countdownTimer; /*显示倒计时的textView*/ private static TextView txtCountdown; /** * 开始倒计时 * @param isFirst 标识是否是第一次进入 * @param second 倒计时时长 单位:秒 * @param textView 显示倒计时的textView */ public static void startCountdown(boolean isFirst,int second,TextView textView) { COUNT = second; long data = System.currentTimeMillis(); long time = TIME_END; //第一次进入时,重新赋值 if(isFirst){ CURR_COUNT = COUNT; time = data + COUNT * 1000; TIME_END = time; }else { int the_difference = ((int) (time - data)) / 1000; CURR_COUNT = the_difference; } //开始倒计时 txtCountdown = textView; if (countdownTimer == null) { countdownTimer = new Timer(); countdownTimer.schedule(new TimerTask() { @Override public void run() { Message msg = new Message(); msg.what = CURR_COUNT--; handler.sendMessage(msg); } }, 0, 1000); //第二个参数delay:"0"的意思是:无延迟 //第三个参数period:"1000"的意思是:每隔多长时间调用一次(单位毫秒) } } /** * 结束倒计时 */ public static void stopCountdown() { //发送消息,结束倒计时 Message message = new Message(); message.what = 0; handler.sendMessage(message); } private static Handler handler = new Handler() { public void handleMessage(Message msg) { if (msg.what <= 0) { if (countdownTimer != null) { countdownTimer.cancel(); countdownTimer = null; } txtCountdown.setText("剩余:00:00:00"); txtCountdown.setEnabled(true); } else { //倒计时效果展示 String txtTime = formatSecondTime(msg.what); txtCountdown.setText(txtTime); txtCountdown.setEnabled(false); } super.handleMessage(msg); } }; /** * 时间格式化方法 * @param second 秒数 * @return */ private static String formatSecondTime(int second) { int hour = 0; int minute = 0; if (second > 60) { minute = second / 60; //取整 second = second % 60; //取余 } if (minute > 60) { hour = minute / 60; minute = minute % 60; } String strtime = "剩余:"+hour+"小时"+minute+"分"+second+"秒"; return strtime; }}
TimeUtils调用方式:
//在启动倒计时的按钮上buttonStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //假设倒计20分钟 int secondTime=20*60; //倒计时 TimeUtils.startCountdown(true,secondTime,txtCountDown); //第一个参数为true,表示刚启动倒计时(第一次) }});
活动的生命周期onRestart()上重新调用,如下:
@Overrideprotected void onRestart() { super.onRestart(); TimeUtils.startCountdown(false,secondTime,txtCountDown); //第一个参数为false,表示非第一次启用,倒计时正在运行中}
更多相关文章
- Android聊天软件开发(基于网易云IM即时通讯)——注册账号(二)
- 在启动activity之前,调用application的oncreate
- Android(安卓)如何让程序定时进行消息通知到通知栏
- android经常调用的组件
- android LayoutInflater.inflate()的参数及其功能
- Android(安卓)VelocityTracker使用总结
- 防止Android点击按钮过快造成多次事件实现原理
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- Python技巧匿名函数、回调函数和高阶函数