2010-12-16 25 views
24

मेरे पास service है जिसे button से प्रारंभ और बंद कर दिया जा सकता है।एक सेवा में रिसीवर रजिस्टर

लेकिन service के भीतर मैं एसएमएस प्रसारण सुनने के लिए एक रिसीवर पंजीकृत करना चाहता हूं। मैं केवल service चाहता हूं कि एसएमएस चलने के दौरान एसएमएस सुनें। मैंने registerReceiver(receiver, intentfilter) की कोशिश की लेकिन यह काम नहीं करता है। मैं क्या गलत कर रहा हूं?

+0

यदि आप समस्या निर्दिष्ट करते हैं तो यह प्रश्न लोगों के लिए अधिक उपयोगी होगा। "यह काम नहीं करता है" = "रिसीवर कभी नहीं बुलाया जाता है", उदाहरण के लिए? या इसे एसएमएस किया जाता है, लेकिन एसएमएस_RECEIVED_ACTION के साथ नहीं? या कोई त्रुटि है? या ... – LarsH

उत्तर

2

आपको AndroidManifest फ़ाइल में अनुमतियां सेट करनी होंगी।

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

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

मैंने यह किया है। मुझे खाता प्रबंधक सेवा और संपर्कप्रदाता त्रुटि मिलती है/ – Vic

+0

क्या मेरा इरादाफ़िल्टर सही है? निजी स्थिर अंतिम स्ट्रिंग SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED"? – Vic

+4

हां यह है कि आप मैनिफेस्ट में रिसीवर कैसे जोड़ते हैं लेकिन मैं इसे गतिशील रूप से पंजीकृत करना चाहता हूं। ऊपर दी गई विधि सभी आने वाली एसएमएस के लिए सुनती है, भले ही मेरी सेवा बंद हो। मैं अपनी सेवा चल रहा है, जबकि मैं केवल एसएमएस के लिए सुनना चाहता हूँ। – Vic

77

आप केवल प्रसारण प्राप्त करना चाहते हैं, जबकि अपनी सेवा चल रही है आप गतिशील OnCreate() में अपने रिसीवर पंजीकरण करना होगा

इसके अलावा यह महत्वपूर्ण है भूल नहीं करने के लिए OnDestroy में अपने रिसीवर का पंजीकरण रद्द करना() तरीका!

उदाहरण:

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.os.IBinder; 
import android.widget.Toast; 

public class YourClass extends Service { 

    private static final String ACTION="android.provider.Telephony.SMS_RECEIVED"; 
    private BroadcastReceiver yourReceiver; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     final IntentFilter theFilter = new IntentFilter(); 
     theFilter.addAction(ACTION); 
     this.yourReceiver = new BroadcastReceiver() { 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       // Do whatever you need it to do when it receives the broadcast 
       // Example show a Toast message... 
       showSuccessfulBroadcast(); 
      } 
     }; 
     // Registers the receiver so that your service will listen for 
     // broadcasts 
     this.registerReceiver(this.yourReceiver, theFilter); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // Do not forget to unregister the receiver!!! 
     this.unregisterReceiver(this.yourReceiver); 
    } 

    private void showSuccessfulBroadcast() { 
     Toast.makeText(this, "Broadcast Successful!!!", Toast.LENGTH_LONG) 
       .show(); 
    } 
} 
+1

धन्यवाद डीडीओएसएटीएक्स, यह काफी आसान था और मैंने इसके लिए कुछ घंटे बिताए लेकिन मुझे कोई अच्छा समाधान नहीं मिला लेकिन आपका काफी आसान और समझदार था। (वाई) धन्यवाद :) – Zaksh

+0

यह उत्तर समाधान के रूप में क्यों स्वीकार नहीं किया जाता है? – akmal

+0

यह उत्तर सही है। मैंने इसे IntentService के लिए उपयोग किया और यह भी काम किया, और मैं विशेष रूप से ऑनरेट() में रिसीवर को पंजीकृत करने पर कुछ जोर देना चाहता हूं! – Edeph

1

एक्सएमएल से आशय फिल्टर निकालें और रिसीवर के ही गतिशील पंजीकरण करते हैं। यदि आप सेवा बंद होने पर काम नहीं करना चाहते हैं, तो सेवा को रोकने से पहले इसे अनधिकृत करें। हालांकि xml को अनुमति जोड़ने के लिए मत भूलना ....

संबंधित मुद्दे