1

广播意图的顺序是否得到保证?也就是说,如果我这样做,

sendBroadcast(intent1);
sendBroadcast(intent2);

接收者是否保证在意图 2 之前获得意图 1?我怀疑答案是否定的,但在这种情况下,我不太确定如何解决我的问题。

我正在尝试为我的应用程序创建一个“忙碌”指示器,当设备在网络上通话时显示忙碌,然后在网络通信完成时消失。所有网络通信都发生在意图服务中。

我的尝试是在服务中开始网络通信时发送 BUSY_START 意图,并在网络通信结束时发送 BUSY_STOP。这似乎主要工作,但我偶尔会发现我的停止和启动消息无序。

有没有更好的方法来解决这个问题?

我正在考虑为每个忙碌的意图添加一个 ID,以便它们可以配对。这样,如果我收到一个我已经收到停止的开始,我可以忽略它。或者,也许更简单,在每个广播中添加一个整数序列号。如果我收到一个广播,其当前意图的序列小于上次接收到的意图的序列,请忽略它。

4

2 回答 2

0

您是否考虑过使用Handler对象从后台线程进行通信IntentService?处理程序优于该BroadcastReciver方法的优点是处理程序使用消息队列对消息对象进行排序。

(我假设您的 Service 与应用程序的主线程在同一进程中)。

于 2012-06-22T01:00:08.217 回答
0

至少一种可行的意图替代方案是通过应用程序类执行消息传递,即

  1. 创建监听接口
  2. 管理应用程序中的侦听器对象集合/提供添加/删除侦听器的方法
  3. 感兴趣的实体调用应用程序方法来添加/删除自己作为侦听器
  4. 在应用程序中添加“通知”方法,在每个注册的侦听器上调用适当的侦听器接口方法
  5. 服务调用应用程序的通知方法来

例如,

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-25T20:32:40.247 回答