mar*_*ram 9 android android-service android-cursor
我创建了一个服务,它在后台线程上同步来自Web的数据,并希望在服务完成时通知列表活动,以便更新它的光标?最好的方法是什么?我正在考虑在服务完成时发送广播,但不确定这是否是最佳方式.我需要在服务完成后重新查询光标,所以我不确定这是否适用于广播接收器?我有一段时间没有做过很多安卓,所以提前谢谢.
zei*_*nst 16
Handler在ListActivity连接服务时注册客户端的服务中使用a ; 也就是说,在您的onServiceConnected方法中ListActivity,发送一个Message到您的服务,使您能够跟踪连接的客户端.然后,您可以简单地遍历这些客户端,Service并Message在您Service希望通知您的情况发送时发送给他们ListActivity.有关更多信息,您可以查看我正在进行的项目中的代码:我ListActivity和我的Service存根.
简而言之,在您的MainActivity启动和绑定您的服务:
Intent i = new Intent(this, NetworkService.class);
startService(i);
bindService(i, networkServiceConnection, Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)
定义一个信使来响应来自服务的消息,如:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后编写您的服务连接代码,如:
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
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,这replyTo是我们刚刚创建的信使.
在您的NetworkService跟踪连接客户端:
ArrayList<Messenger> clients = new ArrayList<Messenger>();
Run Code Online (Sandbox Code Playgroud)
并创建你的处理程序,如:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当您想要向您发送消息时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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您已经在使用支持库,则可以使用LocalBroadcastManager轻松地从服务中播放广播,然后返回您的活动,该活动将监听正在发送的广播.
使用LocalBroadcastManager确保只有您自己的应用程序才能接收广播,因此您不必担心泄露私人数据或打开潜在的安全漏洞.
编辑(09/2014):
更好的方法是使用像Otto(我最喜欢的)或GreenRobot/EventBus这样的事件总线框架,以避免过于紧密地耦合组件.
| 归档时间: |
|
| 查看次数: |
10256 次 |
| 最近记录: |