当我们在android中使用另一个应用程序时,如何停止一个应用程序的服务

时间:2015-03-03 07:36:27

标签: java android

在我的应用程序中,我运行的服务工作正常,但问题是 当我打开任何应用程序,如什么应用程序,脸书等。再次我的服务刚刚开始如何克服这个问题

这是我的代码伙伴:

public class GpsTracker extends Service implements LocationListener {

    Intent intent1;
    LocationManager locationManager;
    public double latitude, longitude;
    String Lat,Log,stringFromFragment,add,time;
    Geocoder geocoder;
    DBHelper dbh;
    StringBuilder strReturnedAddress;
    StausEventDao stausEventDao;
    Context context;
    int minutes=15*60000;

    @Override
    public void onCreate()
    {
        super.onCreate();
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        intent1 = new Intent("com.ds.service");

        Toast.makeText(this, "Starting Tracker", Toast.LENGTH_SHORT).show();
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 900000, 1, this);
        } else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 900000, 1, this);
        } else {
            Toast.makeText(this, "Enable gps to get location", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        if(intent !=null) {
            stringFromFragment = intent.getStringExtra("STATUS");
        }
        return START_STICKY;
    }
    @Override
    public void onLocationChanged(Location location) {

       /* if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 1, this);
        } else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 1, this);
        } else {
            Toast.makeText(this, "Enable gps to get location", Toast.LENGTH_SHORT).show();
        }*/

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        context=getApplicationContext();



        Lat = String.valueOf(latitude);
        Log = String.valueOf(longitude);
        geocoder = new Geocoder(this, Locale.ENGLISH);
        try {
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);

            if (addresses != null) {
                Address returnedAddress = addresses.get(0);
                strReturnedAddress = new StringBuilder("");

                strReturnedAddress.append(returnedAddress.getAddressLine(1)).append("\n");
                add = strReturnedAddress.toString();
            }
        } catch (IOException e)
        {
            e.printStackTrace();
            Toast.makeText(getApplicationContext()," Cannot get Address! ", Toast.LENGTH_LONG).show();
        }

        dbh = new DBHelper(getApplicationContext());
        dbh.getReadableDatabase();

        stausEventDao=new StatusEventImpDao(context);
        stausEventDao.saveStatusEventChange(latitude,longitude,add,time,stringFromFragment);
        String values=stausEventDao.getValues(latitude,longitude,add,time,stringFromFragment);

        Toast.makeText(getApplicationContext(),values,Toast.LENGTH_LONG).show();

        intent1.putExtra("LATITUDE", latitude);
        intent1.putExtra("LONGITUDE", longitude);
        intent1.putExtra("ADDRESS", add);
        sendBroadcast(intent1);
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
    @Override
    public void onProviderEnabled(String provider) {
    }
    @Override
    public void onProviderDisabled(String provider) {
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    public class TrackerBinder extends Binder {
        public GpsTracker getService() {
            return GpsTracker.this;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

如果启动另一个应用程序导致您的服务“重新启动”,那么它可能是一个内存/资源问题...换句话说,那些其他应用程序消耗资源到您的服务被杀死的程度,然后在这些应用程序启动后重新启动已完成或允许您继续。

您基本上有两个选择:

  1. 减少您的应用在运行时消耗的资源,以防止这种情况发生(这非常困难,因设备而异)。但是,这种方法可确保您的服务持续运行。但它要求您减少或改变数据收集/处理的实质内容。

  2. 保留您需要经常保留或保留的数据,并在重新启动之前跟踪服务“停机”的时间,以便您可以收集尽可能多的数据。您还可以尝试测量导致重新启动的资源,内存消耗等,但这样做可能会更快地关闭您的服务。这仍然可能有助于开发最佳操作服务的参数。

  3. 其他应用无法阻止你的。您必须在系统的约束下工作。一旦你意识到这一点,你将重新定义你对“问题”的处理方法。这些其他应用程序可能会占用大量资源,尤其是在较旧的设备上,但无论您遇到的是什么问题。

答案 1 :(得分:0)

通常onStartCommand负责重启服务,请尝试返回START_NOT_STICKY,以防止服务重启。

  @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        if(intent !=null) {
            stringFromFragment = intent.getStringExtra("STATUS");
        }
        return START_NOT_STICKY;
    }