android 服务通知 Activity 完成的最佳方式?

标签 android android-service android-cursor

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

最佳答案

在您的服务中使用 Handler,当您的 ListActivity 连接到服务时注册客户端;也就是说,在 ListActivityonServiceConnected 方法中,向您的服务发送一条 Message,使您能够跟踪已连接的客户端。然后,您可以简单地在您的 Service 中遍历这些客户端,并在您的 Service 中发生您想要通知您的事情时向他们发送 Message ListActivity 关于。有关更多信息,您可以查看我正在进行的项目中的代码:我的 ListActivity和我的 Service stub .

简而言之,在您的 MainActivity 中,启动并绑定(bind)到您的服务:

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 时,只需执行以下操作即可:

for (int i = 0; i < clients.size(); i++) {
    try {
        clients.get(i).send(Message.obtain(null, MSG_SOMETHING));
    } catch (RemoteException e) {
        // If we get here, the client is dead, and we should remove it from the list
        log.debug("Removing client: " + clients.get(i));
        clients.remove(i);
    }
}

关于android 服务通知 Activity 完成的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592178/

相关文章:

Java Home 不同吗?如何在Android Studio中正确设置?

Android 11 对麦克风使用的限制

java - 如何获得服务以将焦点转移到您的后台 Activity ?

android - Sqlite如何使用游标获取字符串项

android - 从联系人列表中获取姓名和电子邮件非常慢

java - 我看不到应用栏中的项目

android - Listview 中的左右对齐行?

c++ - Android 中的 C/C++?

java - WatchFaces 未配置

android - 明确地关闭 SQLite 数据库中的 Cursor,需要还是不需要?