Google Map API v2 no actualiza Maps una vez que se reinicie la aplicación

He escrito una aplicación en android con Google Maps Api V2. La aplicación, básicamente, ejecuta un servicio detrás y los informes de ubicación de la actividad donde Google Map se agrega utilizando SupportMapFragment.

Cuando inicio la aplicación, todo parece funcionar bien y los mapas se actualizan. El problema es cuando vuelvo a pulsar el botón o la pantalla se apaga y volver a la aplicación de Google Maps deje de funcionar. La localización todavía se divulga y llamo el método de moveCamera en el objeto del mapa.

public class GpsTracker extends android.support.v4.app.FragmentActivity { public static final int GPS_LOCATION_UPDATE = 0; public static final int NETWORK_LOCATION_UPDATE = 1; public static final int LOCATION_NETWORK_UNAVAILABLE = 2; public static final int LOCATION_GPS_UNAVAILABLE = 3; private static String gpsTrackerTag = "GpsTracker:MainActivity"; private GoogleMap mMap; private PolylineOptions mpolyOptions = new PolylineOptions(); GpsTrackerMyService myservice = null; ServiceConnection sc = null; static MyHandlerCallback myCallback = null; //private Boolean mServiceRunning = false; // Initial State When service is yet not started. private Boolean mServiceBinded = false; public static Callback CallBackHandler() { return myCallback; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gps_tracker); SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); if (savedInstanceState == null) { // First incarnation of this activity. mapFragment.setRetainInstance(true); } else { // Reincarnated activity. The obtained map is the same map instance in the previous // activity life cycle. There is no need to reinitialize it. mMap = mapFragment.getMap(); } InitializeActivity(); setUpMapIfNeeded(); } @Override protected void onPause() { super.onPause(); if(mServiceBinded) { unbindService(sc); mServiceBinded = false; Log.d(gpsTrackerTag, "onPause(): Unbinded from the Serivce"); } else Log.d(gpsTrackerTag, "onPause(): Service Already in not Bind State"); } @Override protected void onResume() { super.onResume(); if(GpsTrackerMyService.isInstanceCreated() == true) { bindService(new Intent(this, GpsTrackerMyService.class), sc, 0); mServiceBinded = true; Log.d(gpsTrackerTag, "onResume(): Binded to the Service"); } else Log.d(gpsTrackerTag, "onResume(): Service Not Running"); setUpMapIfNeeded(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_gps_tracker, menu); return true; } private void setUpMapIfNeeded() { // Do a null check to confirm that we have not already instantiated the map. if (mMap == null) { // Try to obtain the map from the SupportMapFragment. mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) .getMap(); // Check if we were successful in obtaining the map. if (mMap != null) { setUpMap(); } } } private void setUpMap() { // mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); } private void InitializeActivity() { if(myCallback == null) myCallback = new MyHandlerCallback(); if(sc == null){ sc = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mServiceBinded = false; CharSequence text = "Service DisConnected"; Toast t = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG); t.show(); Log.d(gpsTrackerTag, "Service Disconnected "); } @Override public void onServiceConnected(ComponentName name, IBinder service) { myservice = ((MyBinder) service).getService(); mServiceBinded = true; Log.d(gpsTrackerTag, "Service Connected "); } }; } } public void startButton_Click(View view) { if(GpsTrackerMyService.isInstanceCreated() == false) { Intent serviceIntent = startService(); bindService(serviceIntent); Log.d(gpsTrackerTag, "startButton_Click(): Service Started and Called for bind"); } else Log.d(gpsTrackerTag, "startButton_Click(): Service Already Running"); } private void bindService(Intent serviceIntent) { bindService(serviceIntent, sc, 0 ); } private Intent startService() { Intent serviceIntent = new Intent(this, GpsTrackerMyService.class); startService(serviceIntent); return serviceIntent; } public void stopButton_Click(View view) { stopService(); } private void stopService() { if(GpsTrackerMyService.isInstanceCreated() == true) { Log.d(gpsTrackerTag, "stopService(): Service Running Calling Stop on the Service"); myservice.stopSelf(); } else Log.d(gpsTrackerTag, "stopService(): Service Already Stopped"); } public class MyHandlerCallback implements Callback { @Override public boolean handleMessage(Message arg0) { Location l; CharSequence text; Toast t; LatLng mLatLng; int pos = 1; switch(arg0.what) { case GpsTracker.LOCATION_NETWORK_UNAVAILABLE: text = "Network Location Unavailable"; t = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG); t.show(); return true; case GpsTracker.NETWORK_LOCATION_UPDATE: l = ((Location)arg0.obj); mLatLng = new LatLng(l.getLatitude(), l.getLongitude()); mpolyOptions.add(mLatLng).width(2).color(Color.BLACK).geodesic(true); mMap.addPolyline(mpolyOptions); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 12)); mMap.addMarker(new MarkerOptions() .position(mLatLng) .title("Pos " + pos)); //text = ((Location)arg0.obj).toString(); t = Toast.makeText(getApplicationContext(), "Network Location Update", Toast.LENGTH_LONG); t.show(); return true; case GpsTracker.GPS_LOCATION_UPDATE: l = ((Location)arg0.obj); mLatLng = new LatLng(l.getLatitude(), l.getLongitude()); //mpolyOptions.add(mLatLng).width(2).color(Color.BLACK).geodesic(true); //mMap.addPolyline(mpolyOptions); boolean check = mMap.isMyLocationEnabled(); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLng, 12)); //text = ((Location)arg0.obj).toString(); t = Toast.makeText(getApplicationContext(), "GPS Location Update", Toast.LENGTH_LONG); t.show(); return true; case GpsTracker.LOCATION_GPS_UNAVAILABLE: text = "Gps Location Unavailable"; t = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG); t.show(); return true; default: return false; } } } 

En el caso MyCallBackHandler GPS_LOCATION_UPDATE el mapa no mueve la cámara.

Creo que su problema está relacionado con la clase interna no estática CallBack . Cuando su actividad es recreada, usted mantiene una referencia estática a ella en myCallBack , que en sí tiene una referencia implícita a su antigua Activity . No sólo es una fuga de memoria, sino que cuando invoca el CallBack está buscando las variables de una antigua actividad. Consulte esta publicación para obtener más información sobre pérdidas de memoria y clases internas no estáticas.

Si realiza una nueva Callback cuando Callback una nueva actividad, debería resolver el problema. Por lo tanto, en su InitializeActivity , el cambio

  if(myCallback == null) myCallback = new MyHandlerCallback(); 

a

 myCallback = new MyHandlerCallback(); 
  • ¿Cómo mostrar varios marcadores en MapFragment en Google Map API v2?
  • ¿Cómo obtener la ubicación actual de este código de mapa? También intento recibir datos del vehículo del servidor cuando estoy abierto el mapa
  • GoogleMap.getMyLocation (); No se puede obtener la ubicación actual
  • Encuentra el restaurante más cercano, cafetería y supermercado usando google maps en android
  • Ocultar infowindow android map api v2
  • Adición de marcadores múltiples en Google Maps API v2 Android
  • Android: Cómo agregar marcador animado
  • Cómo mostrar la barra de escala de mapa en el mapa android v2
  • OnMapReady no llamando aunque la visualización del mapa sin ningún error
  • Mostrar el archivo kml con Google Maps Android API v2 sin analizar
  • Android Map API v2 no muestra mapa en algunos dispositivos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.