我需要我的服务只在后台运行,并在应用程序返回前台时立即关闭。我怎样才能做到这一点?

时间:2015-10-15 22:26:10

标签: android service

正如标题所示,我需要一种仅在后台运行的服务。正如您将在下面看到的,我的服务获取用户的位置,可能将其发送到服务器,并一次睡眠10分钟。

我遇到的问题是,当我尝试停止服务时,它不会立即停止,导致UI暂时(但非常明显)无响应30秒左右,具体取决于服务那时正在做。

LocationService

@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
    thread = new Thread(new Runnable() {
        public void run() {
            Log.d("LocationService", "started");
            Hawk.init(getApplicationContext());

            listener = new Listener();

            locationsReceived = new ArrayList<Location>();

            locationManager = (LocationManager) LocationService.this.getSystemService(Context.LOCATION_SERVICE);

            mHandler = new Handler(Looper.getMainLooper());

            runnable = new Runnable() {
                @Override
                public void run() {
                    while (!Thread.currentThread().isInterrupted())
                        try {
                            startLocationUpdates();
                            Thread.sleep(30 * 1000);
                            stopLocationUpdates();
                            Thread.sleep(60 * 1000);
                            if (listener.changed)
                                sendLocationUpdateWithParams();
                            else
                                Log.d("LocationService", "Location not sent to server");
                            Thread.sleep(10 * 60 * 1000);
                        } catch (InterruptedException e) {
                            Log.e("LocationService", "Thread interrupted");
                            Thread.currentThread().interrupt();
                        }
                }
            };

            mHandler.post(runnable);
        }
    });

    thread.start();

    return START_STICKY;

}

@Override
public void onDestroy() {
    super.onDestroy();
    thread.interrupt();
    Log.d("LocationService", "destroyed");
}

TabActivity(主要活动)

@Override
protected void onResume() {
    super.onResume();

    Intent intent = new Intent(this, LocationService.class);
    stopService(intent);
    startingNewActivity = false; // Used to tell whether or not to start service onPause

    Log.i("TabActivity", "onResume");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Intent intent = new Intent(this, LocationService.class);
    stopService(intent);
}

@Override
protected void onPause() {
    super.onPause();

    // Start background location service
    if (!startingNewActivity) {
        Intent intent = new Intent(this, LocationService.class);
        startService(intent);
    }

    Log.i("TabActivity", "onPause");
}

我已经对此做了大量研究,我正在拔头发。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以在调用SharedPreferences)/ onPause( / onDestroy()onResume()设置/重置标记。在onPause()中将标记设置为false onDestroy()。在onResume()中将标志设置为true。在启动Service的位置查看此值。如果设置了值,则表示您的应用在前台运行并启动Service。否则请不要。

答案 1 :(得分:0)

您应在[{1}} flag方法中设置一个onStartCommand(),并在主要活动(启动器活动)中查看。

如果该标志返回 true ,则表示您的服务已经已启动,因此您可以service和/或{{1>中停止该服务主要活动的方法。。即,当应用程序到达前台时,您的服务会停止。

当您的应用转到后台或已关闭时,您应该再次使用 onCreate()和/或onStart() 方法启动该服务。即,当应用程序转到后台时,您的服务就会启动。