java - 如何在android中使用另一个应用程序时停止一个应用程序的服务

标签 java android

在我的应用程序中,我运行的服务工作正常,但问题是 当我再次打开任何应用程序(例如什么应用程序、 Facebook 等)时...我的服务重新开始如何克服这个问题

这是我的代码,伙计们:

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;
        }
    }
}

最佳答案

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

你基本上有两个选择:

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

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

其他应用程序无法阻止您的应用程序。你必须在系统的限制内工作。一旦你认识到这一点,你解决“问题”的方法就会被重新定义。这些其他应用程序可能会消耗大量资源,尤其是在较旧的设备上,但无论如何这都是您所描述的问题。

关于java - 如何在android中使用另一个应用程序时停止一个应用程序的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826411/

相关文章:

java - IntelliJ 中的 Spring 应用程序上下文文件位置

android - XML 约束布局 : Elements placed on top of each other, 修复了吗?

android - 是否可以根据国家/地区限制在 Amazon appstore 上的应用程序分发?

android - 如何从 chrome 无法访问互联网的代码中更改 wifi 高级选项

android - 如何解析 facebook JSON 响应

java - 如何用 Java 编写正确的微基准测试?

java - 在进入页面时创建了许多 session ,而不是一个。为什么?

java - 通过 ActiveMQ 的 InitialContext 设置 MaxThreadPoolSize

java - 如何实现Java可比接口(interface)?

java - afiledialog android 库不工作| NoClassDefFoundError