एक सेवा के भीतर प्रसारण रिसीवर


90

मैं एक के BroadcastReceiverभीतर शुरू करने की कोशिश कर रहा हूँ Service। मैं जो करने की कोशिश कर रहा हूं उसमें एक पृष्ठभूमि चल serviceरही है जो आने वाले टेक्स्ट संदेशों को इकट्ठा करती है, और आने वाले फोन कॉल को लॉग करती है। मुझे इस बारे में जाने का सबसे अच्छा तरीका लगा serviceकि एक ऐसा प्रसारण होना चाहिए जो एक ब्रॉडकास्ट रिसीवर को शामिल करे जो या तो कैटलॉग कर सके।

मैं यह कार्य कैसे करूं? मेरी सेवा पहले से ही चल रही है।

जवाबों:


127

जैसा कि आपकी सेवा पहले से ही सेटअप है, बस अपनी सेवा में एक प्रसारण रिसीवर जोड़ें:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

आपकी सेवा में onCreateयह करें:

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

और आपकी सेवा में onDestroy:

unregisterReceiver(receiver);

और यदि आप कभी भी फिल्टर क्या आप में उल्लेख के लिए प्रसारण प्राप्त करने के लिए जाने के लिए अच्छे हैं onCreate। यदि आवश्यक हो तो किसी भी अनुमति को जोड़ना सुनिश्चित करें। उदाहरण के लिए

<uses-permission android:name="android.permission.RECEIVE_SMS" />

Ive ने देखा कि जब मैं sendBroadcas (इरादा) भेज रहा हूँ, तब मैं इरादे से डेटा पास नहीं कर सकता।
डेडफिश

मैं सेवा जीवन-चक्र के बारे में थोड़ा भ्रमित हूं, जब उसके पास ब्रॉडकास्टर (मेरे मामले में ब्रॉडकास्टसीवर डाउनलोड करें)
एंड्रॉइड मैन

1
@wasaslam क्या आपने इस ब्रॉडकास्टसीवर को अपने मेनिफेस्ट में सेट किया है?
इगोरगानापोलस्की

2
@IgorGanapolsky नहीं, आपको प्रकट रूप से ऐसे रिसीवर को पंजीकृत करने की आवश्यकता नहीं है।
वाकासलाम

2
@SayyedRizwan आपकी सेवा और ब्रॉडकास्टसीवर एक ही प्रक्रिया के तहत चलेगा और संभवत: एक ही थ्रेड (जब तक आप एक नया निर्माण नहीं करेंगे)। । बैटरी की खपत कैसे आप अपने धागा (पृष्ठभूमि / अग्रभूमि) और आने वाले प्रसारण की राशि को परिभाषित किया है पर निर्भर करता है
waqaslam

24

बेहतर पैटर्न एक स्टैंडअलोन बनाना है BroadcastReceiver। यह सुनिश्चित करता है कि आपका ऐप प्रसारण पर प्रतिक्रिया दे सकता है, चाहे Serviceवह चल रहा हो या नहीं । वास्तव में, इस पैटर्न का उपयोग Serviceपूरी तरह से एक निरंतर चलने की आवश्यकता को दूर कर सकता है ।

BroadcastReceiverअपने मैनिफेस्ट में रजिस्टर करें , और इसके लिए एक अलग वर्ग / फ़ाइल बनाएं।

उदाहरण के लिए:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

जब रिसीवर चलता है, तो आप बस एक Intent( Bundle) को पास करते हैं Service, और उसमें जवाब देते हैं onStartCommand()

उदाहरण के लिए:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}

6
मैं चाहता हूं कि प्रसारण सेवा के जीवन चक्र के भीतर हो, ताकि ऐप केवल सेवा समय रेखा के अनुसार संदेश / फोन कॉल को क्वेरी कर रहा हो। क्या यह तरीका सक्षम करता है? ऐसा लगता है कि आपने इसे सेट कर दिया है इसलिए प्रसारण का स्वागत सेवा से सेट हो गया।
यूटोपिया ०२५

यह क्रियान्वयन तब शुरू होगा Serviceजब यह पहले से चल नहीं रहा था, या एक नया पास कर रहा है Intentयदि यह (पुनर्प्राप्ति के लिए onStartCommand) है। आप केवल जब यह दिखाना चाहते हैं तो Serviceजीना है, आप प्रोग्राम को सक्षम / अक्षम कर सकता है Receiverके माध्यम से घटक PackageManagerकी setComponentEnabledSetting()
पॉल बर्क

4
वकास का जवाब आपके लिए सबसे अच्छा विकल्प हो सकता है, यदि आप केवल Receiverजीवित रहना चाहते हैं जब Serviceचल रहा है।
पॉल बर्क

3
यदि आपके पास कोई गतिविधि नहीं है, तो यह एपीआई 3.1 और उच्चतर के लिए काम नहीं करेगा: ashimita.blogspot.com.tr/2012/04/…
elif

1
एंड्रॉइड 3.1 के अनुसार एंड्रॉइड सिस्टम डिफ़ॉल्ट रूप से सभी रिसीवर को प्राप्त करने से रोकता है यदि उपयोगकर्ता द्वारा कभी भी संबंधित एप्लिकेशन शुरू नहीं किया गया है या यदि उपयोगकर्ता ने एंड्रॉइड मेनू के माध्यम से एप्लिकेशन को स्पष्ट रूप से रोक दिया है। vogella.com/tutorials/AndroidBroadcastReceiver/article.html
जुराज पेट्रीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.