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

さて、私は1つの質問を見つけましたが、私の問題には少し違いがあります。サービスにデータを送信する必要はありません。バインドされたすべてのアクティビティ(サービスはまったく認識していません)にデータを送信するだけです。

私が探している構造:

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 に答える