サービスからアクティビティ内のメソッドを呼び出す方法 質問する

サービスからアクティビティ内のメソッドを呼び出す方法 質問する

何らかの音声をリッスンするサービスがあります。音声が文字列と一致すると、サービス オブジェクトで特定のメソッドが呼び出されます。

public class SpeechActivationService extends Service {

     public static Intent makeStartServiceIntent(Context pContext){    

         return new Intent(pContext, SpeechActivationService.class);
     }

     //...

     public void onMatch(){
         Log.d(TAG, "voice matches word");
     }

     //...
}

アクティビティでサービスを開始する方法は次のとおりです。

Intent i = SpeechActivationService.makeStartServiceIntent(this);
startService(i);

このサービス メソッドから、アクティビティ オブジェクトにあるメソッドを呼び出すにはどうすればよいですか? アクティビティからサービスへのアクセスではなく、サービスからアクティビティへのアクセスが必要です。 ハンドラーとブロードキャスターについては既に読みましたが、例が見つかりませんでした。何かアイデアはありますか?

ベストアンサー1

サービスとアクティビティが同じパッケージ(つまり同じアプリ)にあると仮定すると、LocalBroadcastManager を次のように使用できます。

あなたのサービスにおいて:

// Send an Intent with an action named "my-event". 
private void sendMessage() {
  Intent intent = new Intent("my-event");
  // add data
  intent.putExtra("message", "data");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

あなたのアクティビティ:

@Override
public void onResume() {
  super.onResume();

  // Register mMessageReceiver to receive messages.
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("my-event"));
}

// handler for received Intents for the "my-event" event 
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Extract data included in the Intent
    String message = intent.getStringExtra("message");
    Log.d("receiver", "Got message: " + message);
  }
};

@Override
protected void onPause() {
  // Unregister since the activity is not visible
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onPause();
}

@Ascorbin のリンクのセクション 7.3 より:http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html#ownreceiver_localbroadcastmanager

おすすめ記事