2013-02-15 13 views
25

Bazı sesleri dinleyen bir hizmet var. Ses bir dizeyle eşleşirse, hizmet nesnesinde belirli bir yöntem çağrılır. Ben etkinlik nesnesinde bulunan bir yöntemi çağırmak nasıl bu hizmet yöntemine itibarenBir hizmetten etkinlikte yöntem çağırma

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

: Ben aktivitesinde hizmetini başlatmak nasıl

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

    //... 
} 

Bu nedir? Etkinlikten hizmete erişmek istemiyorum, ancak hizmetten etkinliğe. Zaten işleyicileri ve yayıncıları okudum ancak herhangi bir örneği bulamadım/anlayamadım. Herhangi bir fikir?

+0

almayı mu yöntem Etkinlik sınıfta olmak zorunda, ya da bunu bir yardımcı sınıfa taşıyabilirim? –

+0

Kullanıcı arayüzünü güncellemek istiyorum, bu yüzden –

cevap

9

Etkinlikte bir BroadcastReceiver kaydeder ve hizmetten bir niyet gönderirim. Bu başarmak için birçok farklı yolu vardır

+0

aktivite sınıfında olması gerektiğini düşünüyorum. Şimdi çalışıyor! –

2

); http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html Biraz uzun görünebilir ama yine de bu kullanmayı öğrenmek istersiniz: bu öğretici bakın. Bunlardan biri Handler ve Messanger sınıflarını kullanmaktadır. Yöntem,nesnesini Activity nesnesinden Service'a iletmektir. Her Service, Activity'un bazı yöntemlerini çağırmak istediğinde, sadece bir Message ve Activity bir şekilde gönderir.

Etkinlik:

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

Servis şu şekildedir: Hizmetin ve Aktivite varsayarsak

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

Hizmetim hizmetten çıkıyor ve IntentService –

+0

değil "Service" işlevini de kullanabilirsiniz. Bu kod sadece fikri gösterir. Cevabımı güncelledim ve şimdi "IntentService" yerine "Service" i kullandı. –

+0

+1 Teşekkür ederim, ben zaten yayın alıcısıyla yaptım. Http://inchoo.net/mobile-development/android-development/broadcast-receiver-from -aktivite/ –

54

(yani aynı app) aynı paket içinde, sen LocalBroadcastManager kullanabilirsiniz:

Hizmetinizde:

// 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); 
} 
senin Bir Etkinlikte

: Ben gönderme ve yayını almak için benim durumumda aşağıdaki zamanlamaları tespit ettiğimiz bazı araştırmadan sonra http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html#ownreceiver_localbroadcastmanager

+3

Bir çekicilik, TY çalışır! –

+1

Kesinlikle harika, teşekkürler dostum beni kurtardın – Ale

+1

Teşekkürler Tony! Büyük cevap – Nickmccomb

0

: @ Ascorbin en bağlantının bölüm 7.3 itibaren

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

. Aynı süreçte hizmetim var.

sendBroadcast (her iki bileşen, aynı işlemde ise tavsiye edilmez) 34 sn

LocalBroadcastManager.getInstance (bu).sendBroadcast (niyet); yakın sn ila 30 AIDL kullanarak ve hizmetten Uygulaması/Aktivitenin yöntemlerini çağıran gerektiğinde RemoteCallbackList hizmetinizdeyiz

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

aynı süreç veya farklı süreç

için çalışacak uygulanması

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

Kendi sınıfınızda Uygulama veya Aktivite eğilimi. Bu şekilde çağrılması

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

yayından neredeyse anlık ve aynı işlem