是否保证广播意图的顺序?也就是说,如果我这样做了,
sendBroadcast(intent1);
sendBroadcast(intent2);能保证接收器在intent2之前得到intent1吗?我怀疑这个问题的答案是否定的,但在这种情况下,我不太确定如何解决我的问题。
我正在尝试为我的应用程序创建一个“忙”指示器,当设备在网络上通话时显示忙碌,然后在网络通信完成时消失。所有的网络通信都发生在一个意图服务中。
我的尝试是在服务中开始网络通信时发送BUSY_START意图,并在网络通信结束时发送BUSY_STOP。这似乎在很大程度上是有效的,但我发现偶尔会得到停止和启动消息的顺序。
有没有更好的方法来解决这个问题?
我在考虑为每个忙碌的意图添加一个ID,这样它们就可以配对了。这样,如果我收到一个start,而我已经收到了一个stop,我可以忽略它。或者,也许更简单地,在每个广播中添加一个整数序列号。如果我曾经接收到当前意图的序列小于最后接收的意图的序列的广播,请忽略它。
发布于 2012-06-26 04:32:40
意图的至少一个可行的替代方案是通过应用程序类执行消息传递,即,
notify为应用程序中的侦听器对象集合创建侦听器/提供方法以添加/删除listener
上调用相应的侦听器接口方法调用应用程序的通知方法到
例如,
public class MyApplication extends Application {
public interface MyListener {
void onEvent();
}
private Set<MyListener> listeners = new HashSet<Listener>();
public void addListener(MyListener l) {
listeners.add(l);
}
public void removeListener(MyListener l) {
listeners.remove(l);
}
public void sendEvent() {
for (MyListener l: listeners) { l.onEvent(); }
}
}现在,根据您的活动(或片段),
public class MyActivity extends Activity implements MyListener {
...
...
...
@Override
public void onEvent() {
// do something
}
@Override
protected void onResume() {
super.onResume();
((MyApplication)getApplication()).addListener(this);
}
@Override
protected void onPause() {
super.onPause();
((MyApplication)getApplication()).removeListener(this);
}
}在你的服务中,
((MyApplication)getApplication()).sendEvent();这在不使用意图或静态变量的情况下提供同步消息传递。
发布于 2012-06-22 09:00:08
您是否考虑过在IntentService中使用Handler对象从后台线程进行通信?与BroadcastReciver方法相比,处理程序的优势在于,处理程序使用消息队列对消息对象进行排序。
(我假设您的服务与应用程序的主线程处于相同的进程中)。
https://stackoverflow.com/questions/11148496
复制相似问题