从服务到UI层的同步消息

时间:2012-06-21 23:57:10

标签: android android-intent android-service

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

sendBroadcast(intent1);
sendBroadcast(intent2);

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

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

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

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

我正在考虑为每个忙碌的意图添加一个ID,因此它们可以配对。这样,如果我收到一个我已经收到停止的开始,我可以忽略它。或者,更简单地说,在每个广播中添加一个整数序列号。如果我收到当前意图的序列小于最后收到的意图的序列的广播,则忽略它。

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用Handler对象与IntentService中的后台话题进行通信?与BroadcastReciver方法相比,Handler的优势在于Handler使用消息队列对Message对象进行排序。

(我假设您的服务与应用程序的主要线程处于相同的过程中。)

答案 1 :(得分:0)

回答我自己的问题......

至少有一个可行的替代方法是通过应用程序类执行消息传递,即

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

    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();
    

    这提供了同步消息传递,而不使用意图或静态变量。

相关问题