我无法在我的 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 应用上停止我的服务(更新我的位置)!的主要内容,如果未能解决你的问题,请参考以下文章

Android Web 浏览器应用程序停止。无法开始活动

应用程序暂停使用一段时间后,android服务停止工作

Ipad 无法在我的网络应用程序上同时播放音频和视频

无法在我的 android 应用程序中使用 XAMPP 服务器在我的数据库中插入值

每当应用程序被杀死时服务停止

在我的华为手机上调试时,Android Studio 调试器在断点处崩溃/停止