1

这是我关于 SO 的第一个问题,我希望这个问题不会很糟糕。

我有一项服务,它在用户启动应用程序时开始工作,直到用户通过任务杀手杀死它或关闭他的设备。

该服务有一个后台线程,它对数据进行一些处理。我需要绑定活动(来自活动,而不是通过服务),有时(每 30 秒 1-2 次)将数据发送到绑定的活动。

我的服务结构:

public class myserv extends Service {
  public static boolean started=false;
  public class workwithdata extends Thread {
    @Override
    public synchronized void start() {
      super.start();
      //.. Not important.
    }
    @Override
    public void run() {
      if (running) return;
      while (true) {
        if(condition) mythread.sleep(30000);
        else {
          Object data = recieveMyData();
          if (!data.isEmpty()) {
            //.. Some work with recieved data, not important.
            sendDataToBindedActivities(data); //This is what I need.
          }
          mythread.sleep(10000);
        }
      }
    }
  }
  @Override
  public void onCreate() {
    super.onCreate();
    this.started=true;
    mythread = new workwithdata();
    mythread.start();
  }
}

好吧,我发现了一个问题,但我的问题有一点不同:我不需要向服务发送任何数据,我只需向所有绑定的活动发送一些数据(哪个服务根本不知道)。

我正在寻找的结构:

public class myact extends Activity {
  @Override
  public void onCreate(Bundle bun) {
    super.onCreate(bun);
    if(!myserv.started) {
      Intent service = new Intent(getApplicationContext(), myserv.class);
      getApplicationContext().startService(service);
    }
    bindToService(this);
  }
  @Override
  public void onRecievedData(Object data) {
    //work with recieved data from service "myserv".
  }
}

我也试图在 android 文档中找到一些解决方案,但我没有找到我需要的东西。

所以,主要问题是:是否可以处理从服务到活动的通信?. 如果不是:我应该为此目的使用什么?如果是,只是,对不起,我可以要求一些代码或类名,因为我试图找到并且没有......

谢谢你。

4

1 回答 1

0

您需要使用RemoteCallbackList

当您的客户绑定到服务时,您需要使用RemoteCallbackList.register().

当您想向绑定的客户端发送数据时,您可以执行以下操作:

int count = callbackList.beginBroadcast();
for (int i = 0; i < count; i++) {
    try {
        IMyServiceCallback client = callbackList.getBroadcastItem(i);
        client.onRecievedData(theData); // Here you callback the bound client's method
                                  //  onRecievedData() and pass "theData" back
    } catch (RemoteException e) {
        // We can safely ignore this exception. The RemoteCallbackList will take care
        //  of removing the dead object for us.
    } catch (Exception e) {
        // Not much we can do here except log it
        Log.e("while calling back remote client", e);
    }
}
callbackList.finishBroadcast();

一个例子可以在这里找到它有点复杂,但也许你不需要它提供的一切。无论如何,看看。

于 2012-06-06T16:04:49.940 回答