Android应用开发之用Service+Broadcast解决倒计时过程中Activity被销毁的问题
白羽 2018-07-17 来源 :网络 阅读 1034 评论 0

摘要:本文将带你了解Android应用开发之用Service+Broadcast解决倒计时过程中Activity被销毁的问题,希望本文对大家学Android有所帮助。



主要思想是这样的:将倒计时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的倒计时源代码





  


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程