用Service+Broadcast解决倒计时过程中Activity被销毁的问题
解决 过程 Service Activity 倒计时 销毁 问题 Broadcast
2023-09-11 14:20:27 时间
主要思想是这样的:将倒计时CountDownTimer放在Service里面进行,每过一秒就一条发广播,在主Activity里注册广播,收到广播后更新UI。
一、写一个类CodeTimerService继承自Service,重写onStartCommand(...)方法。
1 @Override 2 public int onStartCommand(Intent intent, int flags, int startId) { 3 4 // 第一个参数是总时间, 第二个参数是间隔 5 mCodeTimer = new CountDownTimer(60000, 1000) { 6 @Override 7 public void onTick(long millisUntilFinished) { 8 // 广播剩余时间 9 broadcastUpdate(IN_RUNNING, millisUntilFinished / 1000 + ""); 10 } 11 12 @Override 13 public void onFinish() { 14 // 广播倒计时结束 15 broadcastUpdate(END_RUNNING); 16 // 停止服务 17 stopSelf(); 18 } 19 }; 20 // 开始倒计时 21 mCodeTimer.start(); 22 return super.onStartCommand(intent, flags, startId); 23 } 24 25 // 发送广播 26 private void broadcastUpdate(final String action) { 27 final Intent intent = new Intent(action); 28 sendBroadcast(intent); 29 } 30 31 // 发送带有数据的广播 32 private void broadcastUpdate(final String action, String time) { 33 final Intent intent = new Intent(action); 34 intent.putExtra("time", time); 35 sendBroadcast(intent); 36 }
先了解一下CountDownTimer怎么用:
创建CountDownTimer实例时传入两个参数,第一个参数是总时间, 第二个参数是间隔;需要重写onTick(long millisUntilFinished)和onFinish()两个回调方法,前者表示倒计时进行中,后者表示倒计时结束,在方法中写处理事件;最后调用start()方法开始倒计时。
二、在主Activity中注册广播,接收广播,更新UI
// 注册广播 private static IntentFilter updateIntentFilter() { final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(RegisterCodeTimerService.IN_RUNNING); intentFilter.addAction(RegisterCodeTimerService.END_RUNNING); return intentFilter; } // 广播接收者 private final BroadcastReceiver mUpdateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); switch (action) { case RegisterCodeTimerService.IN_RUNNING: if (btnCountdown.isEnabled()) btnCountdown.setEnabled(false); // 正在倒计时 btnCountdown.setText("倒计时中(" + intent.getStringExtra("time") + ")"); Log.e(TAG, "倒计时中(" + intent.getStringExtra("time") + ")"); break; case RegisterCodeTimerService.END_RUNNING: // 完成倒计时 btnCountdown.setEnabled(true); btnCountdown.setText(R.string.countdown); break; } } }; @Override protected void onResume() { super.onResume(); // 注册广播 registerReceiver(mUpdateReceiver, updateIntentFilter()); } @Override protected void onPause() { super.onPause(); // 移除注册 unregisterReceiver(mUpdateReceiver); }
最后补上例子的源代码:跨Activity的倒计时源代码
相关文章
- SQL Server 2008管理工具出现 远程过程调用失败0x800706be解决方法
- 记一次MySQL数据库拒绝访问的解决过程
- 2021-10-19Server2008R2:由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.的解决方法,求大神们指导
- 仪器仪表---运用示波器同时展现“时域+频域”功能,解决电源时钟等问题
- 解决 If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'
- Mac M1/M2芯片电脑问题解决汇总
- eclipse导入maven项目报错"Missing artifact com.sun.:tools:jar:1.8.0"错误解决方法
- tomcat7源码编译过程以及问题解决
- 使用docker build命令构建docker镜像时apt-get install安装软件过程很慢如何解决?
- 【测试过程问题记录】解决平台创建时间和入库时间不同步问题
- 解决javaWEB开发过程中后台接受前台的中文信息乱码的问题
- docker容器下tomcat 不向catalina.out输出日志解决以及支持中文字符集
- 电脑上做的ppt拿到别的电脑或手机上播放的时候字体错位的解决方法
- 解决vue项目运行过程中,npm run dev 报错问题
- 记一次网站无法访问解决过程,服务器80端口问题解决过程
- 安装PHP过程中,make步骤报错:(集合网络上各种解决方法)
- mysql 存储过程中文乱码的解决方法
- 启动Tomcat一闪而过——分析及解决过程
- Node Sass version 7.0.0 is incompatible with ^4.0.0 || ^5.0.0解决
- 记redis一次Could not get a resource from the pool 异常的解决过程
- [oracle 工程师手记]RMAN duplicate 发生ORA-19504、ORA-17502、ORA-15001、ORA-27140 错误的解决过程
- DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享
- (4.20)SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧
- 记录python接口自动化测试--从excel中读取params参数传入requests请求不生效问题的解决过程(第七目)
- Jetty+json-lib库抛异常的问题解决过程(java.lang.NoClassDefFoundError: net/sf/json/JSONObject)
- Caffe编译过程中出现C++11问题解决记录
- 专访:德国即将打造智能城市平台解决未来城市问题