我无法在我的 Android 应用上停止我的服务(更新我的位置)!
Posted
技术标签:
【中文标题】我无法在我的 Android 应用上停止我的服务(更新我的位置)!【英文标题】:I can't stop my Service (update my location) on my android app! 【发布时间】:2011-03-03 21:47:56 【问题描述】:我已经实现了一项服务,它可以更新我的当前位置并将其发送到我的服务器。 我只使用 ToggleButton: startService() 来调用服务和 stopService() 来停止它。 我在 logCat 上看到该服务在调用 stopService 后继续运行,因为当我重新启动服务时,它会更新两次(三……或四……)我的位置。
我的代码:
服务: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 通过 ToggleButton 调用和销毁服务:
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 是否正在运行。但是如果服务崩溃,就会出现问题。如何检查我的服务状态?
【问题讨论】:
【参考方案1】:您不需要自己启动和停止服务。您可以将您的活动绑定到服务,然后使用服务上的方法来停止/启动它。
要绑定到服务,您需要在活动中使用类似这样的内容,可能在 onCreate 中:
Intent serviceIntent = new Intent();
serviceIntent.setClass(this, YourService.class);
bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);
您还需要做一些其他样板操作,如here 所述。将活动绑定到服务后,您可以通过具体的对象引用使用服务类上的方法停止和启动它。
当您的活动被销毁时,请务必取消与服务的绑定!
unbindService(connection);
【讨论】:
我应该尝试这种方式(更难调用两个本机函数)。感谢我能够启动和停止我的服务,只需调用 startService 和 stopService...【参考方案2】:在 Geolocalisation.java 的 onDestroy 函数中,您并没有结束侦听器,您只是更改程序检查的变量以查看服务是否正在运行。您可以在此处添加代码以阻止位置侦听器继续运行。
locationManager.removeUpdates(locationProvider);
应该可以解决问题。
【讨论】:
“LocationManager 类型中的 removeUpdates(LocationListener) 方法不适用于参数 (String)”。如果我销毁服务,听众就不会再听了,不是吗? 在这种情况下,您只是从管理器中删除了侦听器,服务仍然存在。您可以在 onStart 函数中重新添加 locationprovider。 对不起,我不明白诀窍,我不知道如何删除更新。可以发代码给我看看吗? 添加“locationManager.removeUpdates(locationProvider);”到 onDestroy。添加“locationManager.requestLocationUpdates(locationProvider, 10000, 0, new MajListener());”到 onStart。 其实removeUpdates等待的是:“locationManager.removeUpdates(new MajListener());”。我测试了,问题依然存在……我无法像这样停止服务或监听器。【参考方案3】:要停止更新服务器,也许您应该用停止代码覆盖stopService
函数?
@Override
public stopService(Intent service)
super.stopService();
// code to stop updating server
【讨论】:
服务中的 onDestroy 方法可能是更合适的位置。以上是关于我无法在我的 Android 应用上停止我的服务(更新我的位置)!的主要内容,如果未能解决你的问题,请参考以下文章