2015-08-28 99 views
0

我有TrackingService組件來跟蹤我的城市中基於Crowdsourcing的巴士位置。 TrackingService在後臺運行,然後將數據傳輸到服務器。我有一個地圖活動來顯示總線的位置,在MainActivity中選擇的用戶(作爲過濾器)。LocalBroadcastManager - 接收器未註冊

當應用程序啓動時,背景TrackingService在MainActivity中啓動。

我在BroadcastReceiver的幫助下,通過下面的代碼告知更新的lcoation的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); 

    } 
     @Override 
protected void onStart() { 
    super.onStart();   
    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);  
} 

回答

1

的問題是我如何註冊和取消註冊boradcast。所以我必須使用LocalBroadcastManager以這種方式取消註冊:

@Override 
protected void onStop() { 
    super.onStop(); 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(bReceiver); 

}