Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能';不要在我的android应用程序上停止我的服务(更新我的位置)!_Android_Multithreading_Service_Geolocation - Fatal编程技术网

我能';不要在我的android应用程序上停止我的服务(更新我的位置)!

我能';不要在我的android应用程序上停止我的服务(更新我的位置)!,android,multithreading,service,geolocation,Android,Multithreading,Service,Geolocation,我已经实现了一个服务,它可以更新我的当前位置并将其发送到我的服务器。 我只使用ToggleButton:startService()调用服务,使用stopService()停止服务。 我在logCat上看到,调用stopService后,服务继续运行,因为当我重新启动服务时,它会更新我的位置两次(三次…或四次…) 我的代码: 服务:geologization.java public class Geolocalisation extends Service{ private LocationM

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

我的代码:

服务:geologization.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){
    }
};
My 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我使用SharedReference来确定服务是否正在运行。但是如果服务崩溃,就会出现问题。如何检查我的服务状态?

要停止更新服务器,您可能应该用停止代码覆盖
stopService
功能

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

在GeoLocalization.java中的onDestroy函数中,您不是在结束侦听器,您只是在更改程序检查的变量,以查看服务是否正在运行。您可以在此处添加代码,以阻止位置侦听器进一步运行

locationManager.RemoveUpdate(locationProvider)


应该这样做。

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

要绑定到服务,您需要在活动中使用类似以下内容,可能是在onCreate中:

Intent serviceIntent = new Intent();
serviceIntent.setClass(this, YourService.class);
bindService(serviceIntent, connection, Context.BIND_AUTO_CREATE);
您还需要做其他一些样板工作,如上所述。一旦您的活动绑定到服务,您就可以通过具体的对象引用在服务类上使用方法来停止和启动它

当您的活动被破坏时,请确保解除与服务的绑定

unbindService(connection);

服务中的onDestroy方法可能是更合适的位置。“LocationManager类型中的removeUpdates(LocationListener)方法不适用于参数(字符串)”。如果我破坏了服务,侦听器将不再侦听,不是吗?您只是将侦听器从管理器中删除。在这种情况下,服务仍然存在。您可以在onStart函数中重新添加locationprovider。很抱歉,我不明白其中的诀窍,我不知道如何删除更新。您可以通过发布代码显示给我吗?将“locationManager.removeUpdates(locationProvider);”添加到onDestroy。将“locationManager.requestLocationUpdates(locationProvider,10000,0,new MajListener());”添加到onStart。事实上,removeUpdates等待:“locationManager.removeUpdates(new MajListener());”。我进行了测试,但问题仍然存在……我不能像这样停止服务或侦听器。我应该尝试这种方式(调用两个本机函数更困难)。我感谢我能够启动和停止我的服务,只需调用startService和stopService。。。