2013-02-15 16 views
25

何らかの声を聞くサービスがあります。音声が文字列にマッチすると、サービスオブジェクト内で特定のメソッドが呼び出されます。サービスからアクティビティのメソッドを呼び出す方法

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

このサービスメソッドからは、どのように私は活動のオブジェクトに存在するメソッドを呼び出すことができますか?私は、活動から活動へのアクセスから、活動から活動へのアクセスを望んでいません。私はすでにハンドラと放送局について読んでいますが、どの例も見つけられず理解できませんでした。何か案は?

+0

から受信方法は、Activityクラスにする必要もありませんか、ユーティリティクラスに移動することができますか? –

+0

ユーザーインターフェイスを更新して、アクティビティクラスにする必要があると思っています。 –

答えて

2

これをachiveにはさまざまな方法があります このチュートリアルを参照してください。それらのうちの1人はHandlerMessangerクラスを使用します。メソッドのアイデアは、HandlerオブジェクトをActivityからServiceに渡すことです。 Serviceは、Activityのメソッドを呼び出すたびに、MessageActivityを何とか処理します。

活動:

public class MyActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
       showToast(msg.what); 
      } 
     }; 

     final Intent intent = new Intent(this, MyService.class); 
     final Messenger messenger = new Messenger(handler); 

     intent.putExtra("messenger", messenger); 
     startService(intent); 
    } 

    private void showToast(int messageId) { 
     Toast.makeText(this, "Message " + messageId, Toast.LENGTH_SHORT).show(); 
    } 
} 

サービス:次のようにあなたのサービスとアクティビティを仮定

public class MyService extends Service { 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (intent != null) { 
      final Messenger messenger = (Messenger) intent.getParcelableExtra("messenger"); 
      final Message message = Message.obtain(null, 1234); 

      try { 
       messenger.send(message); 
      } catch (RemoteException exception) { 
       exception.printStackTrace(); 
      } 
     } 

     return START_NOT_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 
+0

私のサービスはIntentServiceではなくサービスから拡張されます –

+0

'Service'も使用できます。このコードはちょうどアイデアを示しています。私は自分の答えを更新し、 'IntentService'の代わりに' Service'を使用しました –

+0

+1ありがとう、私は既に放送受信機でそれを管理していましたhttp://inchoo.net/mobile-development/android-development/broadcast-receiver-from -activity/ –

54

は(すなわち、同じアプリ)同じパッケージ内にある、あなたは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); 
} 
あなたの活動に

:@のAscorbinのリンクのセクション7.3から

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

は:http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html#ownreceiver_localbroadcastmanager

+3

それは魅力、TYとして動作します! –

+1

それは絶対に素晴らしいです、あなたが私を救った男ありがとう – Ale

+1

おかげでトニー!素晴らしい答え – Nickmccomb

0

いくつかの研究の後、私は放送を送受信するために私の場合は、次のタイミングを見つけました。私は同じプロセスで奉仕しています。

sendBroadcast(両成分が同じプロセスである場合、推奨しない) 34秒

LocalBroadcastManager.getInstance(この)。sendBroadcast(インテント); 近い秒30にAIDLを使用して、サービスからアプリケーション/ Acitvityのメソッドを呼び出す必要がある場合RemoteCallbackList があなたのサービス

public final RemoteCallbackList<ICallBackAidl> mDMCallbacks = new RemoteCallbackList<ICallBackAidl>(); 

public void registerDMCallback(ICallBackAidl cb) { 
    Logger.d(LOG_TAG, "registerDMCallback " + cb); 
    if (cb != null) 
     mDMCallbacks.register(cb); 
} 

では、同じプロセスまたは異なるプロセス

のために働くの実装

public void callMehodsInApplication() { 
    final int N = mDMCallbacks.beginBroadcast(); 
    for (int i = 0; i < N; i++) { 
     try { 
      mDMCallbacks.getBroadcastItem(i).method1(); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 
    mDMCallbacks.finishBroadcast(); 
} 

あなたのクラスではアプリケーションまたはアクティビティの管理。この方法を呼び出す

private ISyncmlServiceDMCallback mCallback = new ISyncmlServiceDMCallback.Stub() { 
// Implement callback methods here 
    public void method1() { 
     // Service can call this method 
    } 
} 

public void onServiceConnected(ComponentName name, IBinder service) { 
     svc.LocalBinder binder = (svc.LocalBinder) service; 
     mSvc = binder.getService(); 
     mSvc.registerDMCallback(mCallback); 
} 

は、放送からほとんど瞬間的であり、同じプロセス

関連する問題