2015-08-27 6 views
7

मेरे पास क्रॉडसोर्सिंग के आधार पर मेरे शहर में बसों के स्थान को ट्रैक करने के लिए ट्रैकिंग सेवा घटक है। TrackingService पृष्ठभूमि में काम कर रहा है, तो डेटा सर्वर पर प्रेषित किया जाता है। मेरे पास बसों का स्थान प्रदर्शित करने के लिए एक नक्शा गतिविधि है, जो उपयोगकर्ता मुख्य गतिविधि (फ़िल्टर के रूप में) में चयनित है।java.lang.IllegalArgumentException: रिसीवर पंजीकृत नहीं है

ऐप लॉन्च होने पर पृष्ठभूमि ट्रैकिंग सेवा मुख्य गतिविधि में प्रारंभ की जाती है।

मैं map को नीचे दिए गए कोड में ब्रॉडकास्ट रिसीवर की सहायता से अद्यतन लोकोशन के बारे में गतिविधि को नोटिफ़िक कर रहा हूं। डेटा को मानचित्र गतिविधि में पुनर्प्राप्त किया जा रहा है लेकिन मुझे अपने bReceiver को अनधिकृत करने में समस्या का सामना करना पड़ रहा है। जब मैं ऐप पृष्ठभूमि में जाता हूं या जब उपयोगकर्ता बैक बटन दबाता है तो प्रसारण को अनधिकृत करना चाहता हूं लेकिन मुझे नीचे त्रुटि मिल रही है:

मैं इसे कैसे ठीक कर सकता हूं?

त्रुटि:

08-27 22:43:04.594: E/AndroidRuntime(19588): FATAL EXCEPTION: main 
08-27 22:43:04.594: E/AndroidRuntime(19588): Process: com.bustracker, PID: 19588 
08-27 22:43:04.594: E/AndroidRuntime(19588): java.lang.RuntimeException: Unable to stop activity {com.bustracker/com.bustracker.Map}: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4156) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4219) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ActivityThread.access$1500(ActivityThread.java:177) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1502) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.os.Handler.dispatchMessage(Handler.java:102) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.os.Looper.loop(Looper.java:145) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ActivityThread.main(ActivityThread.java:5944) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at java.lang.reflect.Method.invoke(Native Method) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at java.lang.reflect.Method.invoke(Method.java:372) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1389) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184) 
08-27 22:43:04.594: E/AndroidRuntime(19588): Caused by: java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:822) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:2038) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:528) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at com.bustracker.Map.onStop(Map.java:418) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1275) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.Activity.performStop(Activity.java:6493) 
08-27 22:43:04.594: E/AndroidRuntime(19588): at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4151) 
08-27 22:43:04.594: E/AndroidRuntime(19588): ... 10 more 

TrackingService वर्ग:

public class TrackingService extends Service implements 
     LocationListener { 
    public double pLong; 
    public double pLat; 
    ... 
     @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     detectLocation(); 
     return START_STICKY; 
    } 
    private void detectLocation() { 
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 30 * 1000, 0, 
       this); 
    } 
    @Override 
    public void onLocationChanged(Location location) { 

     if (location != null) { 
     pLong = location.getLongitude(); 
     pLat = location.getLatitude(); 

     Intent intent = new Intent(Map.RECEIVE_latLng); 
     intent.putExtra("location",location); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
      ..... 

    } 

} 

मानचित्र गतिविधि:

public class Map extends FragmentActivity implements OnMapReadyCallback { 
    public static final String RECEIVE_latLng = "com.bustracker.RECEIVE_latLng"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.map); 

     LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this); 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(RECEIVE_latLng); 
     bManager.registerReceiver(bReceiver, intentFilter); 

    } 


    private BroadcastReceiver bReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(RECEIVE_latLng)) { 
           Location location = intent.getParcelableExtra("location"); 
      double lng = location.getLongitude(); 
      double lat = location.getLatitude(); 
      LatLng ll = new LatLng(lat, lng); 
      MarkerOptions markerOpt = new MarkerOptions().title("My Location") 
         .position(ll); 
      System.out.println("ABC map: "+ lat + " ; " + lng); 
      myLocatMarker = map.addMarker(markerOpt); 
      } 
      } 
     };  
     } 
@Override 
protected void onStop() { 
    super.onStop(); 
    unregisterReceiver(bReceiver);  
} 

उत्तर

35

y हैं onCreate() में रजिस्टर करें, आपको onDestroy() में पंजीकरण रद्द करना होगा। अगर आप onStop() में पंजीकरण रद्द करना चाहते हैं तो आपको onStart() में पंजीकरण करना होगा।

गतिविधि जीवन चक्र यहाँ http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

इस का कारण यह है कि onStop() जब Activity पृष्ठभूमि में चला जाता है कहा जाता है, लेकिन जरूरी नहीं कि नष्ट नहीं किया जाता है पर एक नज़र डालें। जब Activity अग्रभूमि onStart() पर वापस आता है, लेकिन onCreate() तो BroadcastReceiver पुनः पंजीकृत नहीं है। फिर जब Activity पृष्ठभूमि में वापस चला जाता है, onStop() फिर से पंजीकरण रद्द करने का प्रयास करता है, लेकिन रिसीवर पंजीकृत नहीं हुआ है।

Helper to register for and send broadcasts of Intents to local objects within your process.

यह अलग है:

LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver); 

LocalBroadcastManagersupport library से एक वर्ग है:

तुम भी LocalBroadcastManager उपयोग करने के लिए अपने रिसीवर का पंजीकरण रद्द करना यदि आप ऐसा है जैसे कि यह रजिस्टर करने के लिए इसका इस्तेमाल किया की जरूरत है Context पर उसी विधि से जो सिस्टम-व्यापी प्रसारण की अनुमति देता है।

एक समान प्रश्न/उत्तर here देखें।

+0

तो मैं onStart() में 'bReceiver' पंजीकृत किया है लेकिन मैं अभी भी त्रुटि हो रही है। –

+0

@ एमआर पूछताछ क्या आप नया कोड और नया स्टैकट्रैक दिखा सकते हैं? –

+0

धन्यवाद, उस जगह को भी नहीं मिला। मैंने अभी जवाब अपडेट किया है। मुझे अभी भी विश्वास है कि मैंने जीवन चक्र विधियों पर किए गए टिप्पणियां भी मान्य हैं, इसलिए मैं उन्हें वहां छोड़ देता हूं। –

3

(अगर आप चाहते हैं बेशक,) आप रजिस्टर या उन्हें onStop() में अपंजीकृत करें और onResume() सिर्फ कोशिश पकड़ के साथ लपेट कर सकते हैं:

try{ getActivity().registerReceiver(receiver,filter); } catch (Exception e){ // already registered } या

try{ getActivity().unregisterReceiver(receiver); } catch (Exception e){ // already unregistered }

0

ध्यान रखें कि आपको उसी संदर्भ पर पंजीकरण और पंजीकरण रद्द करना होगा। उदाहरण के लिए, w/अनुप्रयोग संदर्भ पंजीकृत न करें और w/गतिविधि संदर्भ को पंजीकरण न करें।

इस

getApplicationContext().registerReceiver(myReceiver, myIntentFilter); 
unregisterReceiver(myReceiver); 

(एक गतिविधि के अंदर) के बजाय क्या यह

registerReceiver(myReceiver, myIntentFilter); 
unregisterReceiver(myReceiver); 

मैं सामान्य रूप से अंदर onPostResume() या onResume() रजिस्टर औरsuper.onPause() कॉल के बाद onPause()में अपंजीकृत मत करो।

उदाहरण:

protected void onPostResume() { 
    super.onPostResume(); 

    registerReceiver(myReceiver, myIntentFilter); 
} 

protected void onPause() { 
    unregisterReceiver(tripInCartReceiver1); 

    //called after unregistering 
    super.onPause(); 
} 
संबंधित मुद्दे