zoukankan      html  css  js  c++  java
  • 用Service+Broadcast解决倒计时过程中Activity被销毁的问题

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

  • 相关阅读:
    [LeetCode]Valid Parentheses
    LeetCode & Q219-Contains Duplicate II
    LeetCode & Q217-Contains Duplicate-Easy
    LeetCode & Q189-Rotate Array-Easy
    LeetCode & Q169-Majority Element-Easy
    LeetCode & Q167-Two Sum II
    LeetCode & Q122-Best Time to Buy and Sell Stock II-Easy
    LeetCode & Q121-Best Time to Buy and Sell Stock-Easy
    MapReduce工作机制——Word Count实例(一)
    LeetCode & Q119-Pascal's Triangle II-Easy
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/9092845.html
Copyright © 2011-2022 走看看