2013-02-15 46 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

से प्राप्त करता है विधि गतिविधि कक्षा में रहना होगा, या आप इसे एक उपयोगिता वर्ग में स्थानांतरित कर सकते हैं? –

+0

मैं उपयोगकर्ता इंटरफ़ेस को अपडेट करना चाहता हूं, इसलिए मुझे लगता है कि इसे गतिविधि कक्षा –

उत्तर

9

मैं गतिविधि में ब्रॉडकास्ट रिसीवर पंजीकृत करूँगा और सेवा से इसका इरादा भेजूंगा। इस ट्यूटोरियल देखें: http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html यह थोड़ा लंबा लग सकता है, लेकिन आप कैसे वैसे भी उन का उपयोग करने के जानने के लिए चाहता हूँ;)

+0

में होना चाहिए धन्यवाद यह अब काम करता है! –

2

इस हासिल करने के लिए कई अलग अलग तरीके हैं। उनमें से एक Handler और Messanger कक्षाओं का उपयोग करने के लिए। विधि का विचार Handler ऑब्जेक्ट Activity से Service पर पास करना है। हर बार ServiceActivity की कुछ विधि को कॉल करना चाहता है, यह सिर्फ Message और Activity भेजता है इसे किसी भी तरह से संभालता है।

गतिविधि:

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

आप 'सेवा' का भी उपयोग कर सकते हैं। यह कोड सिर्फ विचार दिखाता है। मैंने अपना जवाब अपडेट किया और अब यह 'IntentService' –

+0

+1 के बजाय' सेवा' का उपयोग करता है धन्यवाद, मैंने इसे पहले से ही प्रसारण रिसीवर के साथ प्रबंधित किया है http://inchoo.net/mobile-development/android-development/broadcast-receiver-from -एक्टिविटी/ –

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

अपनी गतिविधि में:

@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

+3

यह एक आकर्षण के रूप में काम करता है, टीवाई! –

+1

यह बिल्कुल बढ़िया है, धन्यवाद आदमी आपने मुझे बचाया – Ale

+1

धन्यवाद टोनी! महान उत्तर – Nickmccomb

0

कुछ शोध मैं भेजने और प्रसारण प्राप्त करने के लिए मेरे मामले में निम्नलिखित समय पाया के बाद। मेरे पास एक ही प्रक्रिया में सेवा है।

sendBroadcast (अनुशंसित नहीं करता है, तो दोनों घटकों एक ही प्रक्रिया में हैं) 34 सेकंड

LocalBroadcastManager.getInstance (यह)।sendBroadcast (आशय); करीब 30 सेकंड के लिए

AIDL का उपयोग करने और 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); 
} 

में जब आप फोन सेवा से आवेदन/Acitvity में तरीकों की जरूरत को लागू करने

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

इस तरह कॉलिंग प्रसारण से लगभग तात्कालिक है और एक ही प्रक्रिया