从服务中运行的countDownTimer更新UI

时间:2015-11-21 15:28:57

标签: android android-intent

因此,根据我的理解,我应该使用意图来更新服务的活动UI。

但是,我有点担心我想做的事情的效率。

从理论上说,它不应该造成严重的问题,但我不想让我的手机醒来,并且运行20-30 onTick秒立刻,每次都产生新的意图。

我想要的(如果可能的话)是每个onTick覆盖前一个的意图,以便接收者一次只有一个进程。

我知道待处理的意图有FLAG_UPDATE_CURRENT,但正确的做法意味着(如果我理解正确的话)使用本地广播,这不会对未决意图有效。

1 个答案:

答案 0 :(得分:0)

事实证明这非常简单。 一个pskink在他的评论中提出,你需要的只是一个活页夹:

  1. 创建一个扩展Binder类的类。请记住,Binder类实现了IBinder,这就是为什么你可以将新类的实例作为IBinder的实例传递的原因(这是你稍后会做的)

  2. 在本课程中,实现您希望主要活动能够使用的各种功能。如果您希望您的服务能够从活动中运行事物,您可以传递活动的内部类的实例,其中包含相关的函数,或者甚至传递指向活动的指针({{1 }})。

  3. 请记住:这些事情需要您自担风险。例如,如果您的活动被销毁 - 例如,由于方向的改变,指针可能会变得毫无价值而且会抛出错误

    我建议在新课程中实施this以帮助您处理这些情况,但也许有一些我不熟悉的更好的实践。

    现在,您的活动与您有双向沟通渠道。

    下面是一些示例代码。请注意,如果您不希望在活动发布时销毁您的服务,则您需要(据我所知)也可以使用invalidate启动它(除了使用startService)< / p>

    bindService

    您的活页夹类:

    public class MyService extends Service {
        private  IBinder yourBinder; //A class that will connect your service and your activity
    
        @Override
        public void onCreate() {
            super.onCreate();
            yourBinder = new YourBinderClass();
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO: Return the communication channel to the service.
            return yourBinder;
        }
    

    最后,在你的主要活动中:

    public class YourBinderClass extends Binder {
        private Service thisService;
        public YourBinderClass(Service myService)
        {
            thisService = myService;
        }
    
        public Service getService()
        {
            return thisService;
        }
    

    启动服务:

    private YourBinderClass yourBinderClass;
    private Service yourService;
    private ServiceConnection sc = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                yourBinderClass = (YourBinderClass) service;
                yourService = yourBinderClass.getService();
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        };
    

    请注意,该服务不会立即就绪,因此,如果您的活动依赖于该服务,您可能希望发信号通知您已准备好在getBaseContext().bindService(new Intent(getBaseContext(),MyService.class), sc, 0)

    中执行操作