2011-03-03 21 views
3

我已经实现了一个服务,它更新我的当前位置并将其发送到我的服务器。 我只使用ToggleButton:startService()来调用服务,stopService()来停止它。 我在logCat上看到服务在调用stopService后继续运行,因为当我重新启动服务时,它会更新两次(三...或四..)我的位置。我无法停止我的服务(更新我的位置)在我的Android应用程序!

我的代码:

服务:Geolocalisation.java

public class Geolocalisation extends Service{ 

private LocationManager locationManager; 
//private String locationProvider = LocationManager.NETWORK_PROVIDER; 
private String locationProvider = LocationManager.NETWORK_PROVIDER; 

@Override 
public void onCreate(){ 

    System.out.println("Service en cours !!"); 

    //Recuperation Location 
    String locationContext = Context.LOCATION_SERVICE; 
    locationManager = (LocationManager) getSystemService(locationContext); 
    if (locationManager != null && locationProvider != null) { 

     majCoordonnes(); 
     locationManager.requestLocationUpdates(locationProvider, 10000, 0, new MajListener()); 

    } 

} 

@Override 
public void onStart(Intent intent, int StartId){ 
    System.out.println("Service commence !!"); 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean("geo", true); 
    editor.commit();  
} 

@Override 
public void onDestroy(){ 
    System.out.println("Service détruit !!"); 
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean("geo", false); 
    editor.commit();  

} 

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


public void majCoordonnes() { 
    StringBuilder stringBuilder = new StringBuilder("Fournisseur :"); 
    stringBuilder.append("\n"); 
    stringBuilder.append(locationProvider); 
    stringBuilder.append(" : "); 
    Location location = locationManager.getLastKnownLocation(locationProvider); 

    if (location != null) { 

     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 

     String lat = String.valueOf(latitude); 
     String lon = String.valueOf(longitude); 

     stringBuilder.append(latitude); 
     stringBuilder.append(", "); 
     stringBuilder.append(longitude); 

     //Send location to server 
     new sendLocation().execute(lat, lon); 

     System.out.println("Localisation: "+ lat +" "+lon); 


    } else { 
     stringBuilder.append("Non déterminée"); 
    } 
    //Log.d("MaPositionMaj", stringBuilder.toString()); 
} 


/** 
* Ecouteur utilisé pour les mises à jour des coordonnées 
*/ 
class MajListener implements android.location.LocationListener { 

    public void onLocationChanged(Location location) { 
     majCoordonnes(); 
     System.out.println("Update geo!"); 
    } 
    public void onProviderDisabled(String provider){ 
    } 
    public void onProviderEnabled(String provider){ 
    } 
    public void onStatusChanged(String provider, int status, Bundle extras){ 
    } 
}; 

我Main.java其打电话,摧毁切换按钮的服务:

intentGeo = new Intent().setClass(this,Geolocalisation.class); 

    Boolean boolLog = preferences.getBoolean("geo", false); 

    final ToggleButton toggleAge = (ToggleButton) findViewById(R.id.ToggleGeo); 

    //Check ToggleButton if the service is already running 
    if(boolLog != true){ 
     try{ 
      toggleAge.setChecked(false); 

     }catch (Exception e){ 
      System.out.println("Service Error"); 
     }  
    } else { 
     toggleAge.setChecked(true); 
    } 

    //Activer ou désactivé le service de géolocalisation 
    toggleAge.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on clicks 
      if (toggleAge.isChecked()) { 

       try{ 
        startService(intentGeo); 
        System.out.println("Turn ON"); 
       }catch (Exception e){ 
        System.out.println("Service Error"); 
       } 

      } else { 

       try{ 
        stopService(intentGeo); 
        System.out.println("Turn OFF"); 
       }catch (Exception e){ 
        System.out.println("Service Error"); 
       } 
      } 
     } 
    }); 

感谢您的帮助!

PS我使用Sharedpreference确定Service是否正在运行。但是如果服务崩溃,它会发生问题。我如何检查我的服务状态?

回答

2

您不应该需要自己启动和停止服务。您可以将您的活动绑定到服务,然后使用服务上的方法来停止/启动它。

绑定到一个服务,你需要使用像这样从你的活动,大概在的onCreate:

Intent serviceIntent = new Intent(); 
serviceIntent.setClass(this, YourService.class); 
bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE); 

有你需要做一些其他的事情样板,描述here。一旦你的活动被绑定到服务上,你就可以通过一个具体的对象引用使用服务类中的方法来停止和启动它。

只要您的活动被破坏,请务必从服务中解除绑定!

unbindService(connection); 
+0

我应该尝试这种方式(更难调用两个本地函数)。感谢我能够启动并停止我的服务,只需调用startService和stopService ... – user420574 2011-03-03 22:18:09

0

要停止更新服务器,可能应该使用停止代码覆盖stopService函数?

@Override 
public stopService(Intent service) 
{ 
    super.stopService(); 
    // code to stop updating server 
} 
+0

服务中的onDestroy方法可能是更合适的位置。 – 2011-03-03 22:03:39

1

在从Geolocalisation.java您OnDestroy函数中你是不是结束监听器,你只要改变变量,你的程序检查,看是否该服务是否运行。您可以在此添加代码以停止位置监听器进一步运行。

locationManager.removeUpdates(locationProvider);

应该做的伎俩。

+0

“LocationManager类型中的removeUpdates(LocationListener)方法不适用于参数(字符串)”。如果我摧毁了服务,听众不会再听,不是? – user420574 2011-03-03 22:10:51

+0

在这种情况下,您只能从经理中删除监听者,该服务仍然存在。您可以在onStart函数中重新添加locationprovider。 – Sorean 2011-03-03 22:28:52

+0

对不起,但我不明白的诀窍,我不知道如何删除更新。你可以通过发布代码告诉我吗? – user420574 2011-03-03 22:41:26

相关问题