2012-02-01 14 views
74

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

मैं यह करने के बारे में कैसे जा सकता हूं? मेरे पास पहले से ही मेरी सेवा है और चल रहा है।

उत्तर

106

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

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

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

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

मैं टोस्ट संदेश जबकि इनकमिंग कॉल प्रदर्शित करना चाहते हैं। मैंने यह फ़िल्टर जोड़ा .addAction ("android.provider.Telephony.LISTEN_CALL_STATE"); तो शो टोस्ट कैसे करें। – Prasad

+0

मैंने देखा है कि भेजने के दौरान intent.setData (myUri) द्वारा डेटा पास नहीं कर सकता है ब्रॉडकास (इरादा) और braoadcastReceiver उस मामले में काम नहीं करता है, है ना? – deadfish

+0

मैं सेवा जीवन चक्र के बारे में थोड़ा उलझन में हूं जब ब्रॉडकास्ट रिसीवर (मेरे मामले में ब्रॉडकास्ट रिसीवर) –

23

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

अपने मैनिफेस्ट में BroadcastReceiver पंजीकृत करें और इसके लिए एक अलग श्रेणी/फ़ाइल बनाएं।

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

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

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

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

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

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

+0

यह कार्यान्वयन 'सेवा' शुरू करेगा यदि यह पहले से नहीं चल रहा था, या यदि यह है तो' नया 'इरादा पास करें (' ऑनस्टार्ट कमांड 'में पुनर्प्राप्ति के लिए)। यदि आप केवल 'सेवा' लाइव होने पर इसे चलाने के लिए चाहते हैं, तो आप 'PackageManager' 'setComponentEnabledSetting()' के माध्यम से' रिसीवर 'घटक को प्रोग्रामेटिक रूप से सक्षम/अक्षम कर सकते हैं। –

+3

वकास का उत्तर आपका सबसे अच्छा विकल्प हो सकता है, अगर आप 'सेवा' चल रहे हों तो केवल 'रिसीवर' जीवित रहना चाहें। –