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