是否保证广播意图的顺序?也就是说,如果我这样做,
sendBroadcast(intent1);
sendBroadcast(intent2);
是保证在intent2之前获得intent1的接收者吗?我怀疑答案是否定的,但在这种情况下,我不太确定如何解决我的问题。
我正在尝试为我的应用创建一个“忙”指示器,当设备在网络上通话时显示忙,然后在网络通信完成时消失。所有网络通信都发生在意向服务中。
我的尝试是在服务中开始网络通信时发送BUSY_START意图,在网络通信结束时发送BUSY_STOP。这似乎主要是有效的,但我偶尔会发现我得到了停止并开始无序的消息。
有没有更好的方法来解决这个问题?
我正在考虑为每个忙碌的意图添加一个ID,因此它们可以配对。这样,如果我收到一个我已经收到停止的开始,我可以忽略它。或者,更简单地说,在每个广播中添加一个整数序列号。如果我收到当前意图的序列小于最后收到的意图的序列的广播,则忽略它。
答案 0 :(得分:0)
您是否考虑过使用Handler
对象与IntentService
中的后台话题进行通信?与BroadcastReciver
方法相比,Handler的优势在于Handler使用消息队列对Message对象进行排序。
(我假设您的服务与应用程序的主要线程处于相同的过程中。)
答案 1 :(得分:0)
回答我自己的问题......
至少有一个可行的替代方法是通过应用程序类执行消息传递,即
例如,
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();
这提供了同步消息传递,而不使用意图或静态变量。