Android service de ne pas s'arrêter quand stopService() est appelée
Je vais avoir un problème de l'arrêt d'un service que j'ai commencé.
Le service est appelé lorsque l'utilisateur se connecte, et commence à suivre la localisation de l'utilisateur. Cela fonctionne bien. Le service est censé s'arrêter lorsque l'utilisateur appuie sur le bouton de déconnexion et est connecté avec succès.
C'est un androïde de service qui est appelé au travers d'une interface JavaScript par un bouton HTML.
Ici est ma Classe Principale qui contient les méthodes pour démarrer et arrêter le service:
public class CasesMain extends DroidGap {
Intent gpsTracking;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.init();
appView.addJavascriptInterface(this, "StartGPS");
super.loadUrl(Config.getStartUrl());
}
public void startGPS(){
gpsTracking = new Intent(this, MyService.class);
startService(gpsTracking);
}
public void stopGPS(){
stopService( gpsTracking );
}
}
Ici est la MyService classe:
public class MyService extends Service {
private LocationManager locManager;
private LocationListener locListener = new myLocationListener();
private boolean gps_enabled = false;
private boolean network_enabled = false;
private Handler handler = new Handler();
Thread t;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
}
@Override
public void onDestroy() {
}
@Override
public void onStart(Intent intent, int startid) {
}
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getBaseContext(), "Service Started", Toast.LENGTH_SHORT)
.show();
final Runnable r = new Runnable() {
public void run() {
location();
handler.postDelayed(this, 10000);
}
};
handler.postDelayed(r, 10000);
return START_STICKY;
}
public void location() {
locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
gps_enabled = locManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
}
try {
network_enabled = locManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
}
if (gps_enabled) {
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
0, locListener);
}
if (network_enabled) {
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
0, 0, locListener);
}
}
private class myLocationListener implements LocationListener {
double lat_old = 0.0;
double lon_old = 0.0;
double lat_new;
double lon_new;
@Override
public void onLocationChanged(Location location) {
if (location != null) {
locManager.removeUpdates(locListener);
lon_new = location.getLongitude();
lat_new = location.getLatitude();
String longitude = "Longitude: " + location.getLongitude();
String latitude = "Latitude: " + location.getLatitude();
Log.v("Debug", "Latt: " + latitude + " Long: " + longitude);
Toast.makeText(getApplicationContext(),
longitude + "\n" + latitude, Toast.LENGTH_SHORT).show();
lat_old = lat_new;
lon_old = lon_new;
}
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
}
Et voici mon appel pour arrêter le service: window.StartGPS.stopGPS();
Le début fonctionne parfaitement, mais lorsque je me déconnecte, l'application continue à afficher des messages du latt et le long de la signification de l'appel à stopService()
soit ne fonctionne pas ou n'est pas appelé.
Peut-on voir d'où mon erreur est ou ce qui ne va pas?
Toute aide serait grandement appréciée!
FIXE
L'ajout de handler.removeCallbacksAndMessages(null);
dans le onDestroy()
méthode de MyService
fixe pour moi.
OriginalL'auteur MrJR | 2014-01-03
Vous devez vous connecter pour publier un commentaire.
Vous avez un vide
onDestroy()
méthode. Vous devez appelerremoveCallbacks()
sur votreHandler
.Merci encore, cela a résolu pour moi
handler.removeCallbacksAndMessages(null);
Davantage l'accent sur la solution serait de conserver votre
Runnable
et passer àremoveCallbacks()
.Pas très bien... onDestroy() la méthode de parfois n'est jamais appelée. Devrait être, mais n'est pas (Android BUG).
La seule fois que je sais de quand
onDestroy()
ne sera pas appelé c'est que si le processus est terminé, auquel cas leHandler
est discutable.OriginalL'auteur CommonsWare
Si vous utilisez android.os.Gestionnaire dans le service, n'oubliez pas d'appeler removeCallbacksAndMessages comme ceci:
Et le service détruire avec succès. Il a travaillé pour moi.
OriginalL'auteur AlexA
Voici ce que je suggère
1) Mettre plus de journal des déclarations dans les appels conduisant à stopService.
2) mettre en Œuvre Sur ServiceConnection de l'interface et de voir ce qui se passe dans OServiceConnected et onServiceDisconnected.
OriginalL'auteur Sathya