android服务通知活动完成最好的方法?

时间:2011-07-06 06:01:56

标签: android android-service android-cursor

我创建了一个服务,它在后台线程上同步来自Web的数据,并希望在服务完成后通知列表活动,以便更新它的光标?最好的方法是什么?我正在考虑在服务完成时发送广播,但不确定这是否是最佳方式。我需要在服务完成后重新查询光标,所以我不确定这是否适用于广播接收器?我有一段时间没有做过很多安卓,所以提前谢谢。

3 个答案:

答案 0 :(得分:15)

Handler连接到服务时,在您的服务中使用ListActivity注册客户端;也就是说,在onServiceConnected的{​​{1}}方法中,向您的服务发送ListActivity,以便您跟踪已连接的客户端。然后,您可以在Message中循环浏览这些客户端,并在Service中要通知您Message的某些内容时向他们发送Service。有关详细信息,您可以查看我正在进行的项目中的代码:我的ListActivity和我的Service stub

简而言之,在ListActivity中,使用以下命令启动并绑定到您的服务:

MainActivity

定义一个信使来响应来自服务的消息,如:

Intent i = new Intent(this, NetworkService.class);
startService(i);
bindService(i, networkServiceConnection, Context.BIND_AUTO_CREATE);

然后编写您的服务连接代码,如:

Messenger messenger = new Messenger(new IncomingHandler());

class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case NetworkService.MSG_SOMETHING:
                // do something here
                break;
            default:
                super.handleMessage(msg);
        }
    }
}

请注意,private ServiceConnection networkServiceConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { networkService = new Messenger(service); try { Message msg = Message.obtain(null, NetworkService.MSG_REGISTER_CLIENT); msg.replyTo = messenger; networkService.send(msg); log.debug("Connected to service"); } catch (RemoteException e) { // Here, the service has crashed even before we were able to connect } } 是我们刚创建的信使。

replyTo中,通过以下方式跟踪已连接的客户:

NetworkService

并创建您的处理程序,如:

ArrayList<Messenger> clients = new ArrayList<Messenger>();

然后,当您要将消息发送回class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_REGISTER_CLIENT: log.debug("Adding client: " + msg.replyTo); clients.add(msg.replyTo); break; default: super.handleMessage(msg); break; } } } 时,请执行以下操作:

MainActivity

答案 1 :(得分:5)

如果您已经在使用支持库,那么您可以使用LocalBroadcastManager轻松地从服务中播放广播,然后返回您的活动,该活动将监听正在发送的广播。

使用LocalBroadcastManager确保只有您自己的应用程序才能接收广播,因此您不必担心泄露私人数据或打开潜在的安全漏洞。

另见:how to use LocalBroadcastManager?

编辑(09/2014):

更好的方法是使用Otto(我最喜欢的)或GreenRobot/EventBus之类的事件总线框架,以避免将组件过于紧密耦合。

答案 2 :(得分:0)

根据 The Busy Coder's Guide to Advanced Android Development

  

Event Bus是服务让其他作品的好方法   该应用程序知道某些工作已完成。它提供了一个标准   通信渠道(或“公共汽车”)即事件生产者和事件   消费者可以进入。活动制作人只需要举办活动   去公交车;公共汽车将处理相关的事件   消费者。这减少了生产者和生产者之间的耦合   消费者,有时甚至减少了所需的代码量   并沉没这些事件。