如何从服务中调用活动中的方法

Upv*_*ote 28 android android-intent android-service android-handler

有一种服务可以听取一些声音.如果语音匹配字符串,则在服务对象中调用某个方法.

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

     //...
}
Run Code Online (Sandbox Code Playgroud)

这就是我在我的活动中启动服务的方式:

Intent i = SpeechActivationService.makeStartServiceIntent(this);
startService(i);
Run Code Online (Sandbox Code Playgroud)

从这个服务方法,我如何调用驻留在activity对象中的方法?我不希望从活动到服务的访问,而是从服务到活动.我已经阅读过有关处理程序和广播公司的内容,但无法找到/理解任何示例.有任何想法吗?

Ton*_*ham 60

假设您的服务和活动位于同一个包中(即相同的应用程序),您可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

在您的活动中:

@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();
}
Run Code Online (Sandbox Code Playgroud)

来自@ Ascorbin链接的第7.3节:http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html#ownreceiver_localbroadcastmanager


asc*_*sco 11

我会在Activity中注册一个BroadcastReceiver并从服务中向它发送一个Intent.请参阅本教程:http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html 它可能看起来有点长,但无论如何你都想学习如何使用它们;)