资讯专栏INFORMATION COLUMN

用Service+Broadcast解决倒计时过程中Activity被销毁的问题

OldPanda / 569人阅读

摘要:主要思想是这样的将倒计时放在里面进行,每过一秒就一条发广播,在主里注册广播,收到广播后更新。二在主中注册广播,接收广播,更新注册广播广播接收者正在倒计时倒计时中倒计时中完成倒计时注册广播移除注册最后补上例子的源代码跨的倒计时源代码

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

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/3047.html

相关文章

  • Android四大组件之BroadcastReceiver全解析

    摘要:但是,一定会被执行,从而保证了广播在死亡前一定会被注销,从而防止内存泄露。对于应用内广播的动态注册非方式,回调中的返回值是 前言 BroadcastReceiver(广播接收器),属于Android四大组件之一 在Android开发中,BroadcastReceiver的应用场景非常多 今天,我将详细讲解关于BroadcastReceiver的一切相关知识 目录 showImg(...

    yearsj 评论0 收藏0
  • Android四大组件之BroadcastReceiver全解析

    摘要:但是,一定会被执行,从而保证了广播在死亡前一定会被注销,从而防止内存泄露。对于应用内广播的动态注册非方式,回调中的返回值是 前言 BroadcastReceiver(广播接收器),属于Android四大组件之一 在Android开发中,BroadcastReceiver的应用场景非常多 今天,我将详细讲解关于BroadcastReceiver的一切相关知识 目录 showImg(...

    paraller 评论0 收藏0
  • Broadcast 使详解

    摘要:静态注册广播的方法动态注册广播在中动态注册广播,通常格式如下动态注册广播动态注册监听灭屏点亮屏幕的广播在广播中动态注册广播请注意一定要使用,防止为空,引起空指针异常。绑定模式此模式通过绑定组件等调用启动此服务随绑定组件的消亡而解除绑定。 showImg(https://segmentfault.com/img/remote/1460000019975019?w=157&h=54); 极...

    Y3G 评论0 收藏0
  • 01.Android之基础组件问题

    摘要:此时再次旋转屏幕时,该不会被系统杀死和重建,只会调用。因此可通过和来判断是否被重建,并取出数据进行恢复。但需要注意的是,在取出数据时一定要先判断是否为空。只有在进程不被掉,正常情况下才会执行方法。 目录介绍 1.0.0.1 说下Activity的生命周期?屏幕旋转时生命周期?异常条件会调用什么方法? 1.0.0.2 后台的Activity被系统回收怎么办?说一下onSaveInsta...

    iamyoung001 评论0 收藏0
  • Android四大组件之BroadcastReceiver

    摘要:作为的四大组件之二,其应用场景非常多。作用可以监听或接收应用或系统发出的广播消息,并做出响应。可以指定独立的进程四大组件都可以通过此属性指定自己的独立进程。对于应用内广播的动态注册方式,回调中的返回值是。 前言 Hi,大家好,又双见面啦,上一期我们讲了如何使用Activity,肯定有不少小伙伴已经创建了属于自己的FirstActivity,那么这一期我们主要为大家介绍第二个重要组件Br...

    plus2047 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<