正如标题所示,我需要一种仅在后台运行的服务。正如您将在下面看到的,我的服务获取用户的位置,可能将其发送到服务器,并一次睡眠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");
}
我已经对此做了大量研究,我正在拔头发。
提前致谢!
答案 0 :(得分:0)
您可以在调用SharedPreferences
)/ onPause(
/ onDestroy()
时onResume()
设置/重置标记。在onPause()
中将标记设置为false onDestroy()
。在onResume()
中将标志设置为true。在启动Service
的位置查看此值。如果设置了值,则表示您的应用在前台运行并启动Service
。否则请不要。
答案 1 :(得分:0)
您应在[{1}} flag
方法中设置一个onStartCommand()
,并在主要活动(启动器活动)中查看。
如果该标志返回 true ,则表示您的服务已经已启动,因此您可以在service
和/或{{1>中停止该服务主要活动的方法。。即,当应用程序到达前台时,您的服务会停止。
当您的应用转到后台或已关闭时,您应该再次使用 onCreate()
和/或onStart()
方法启动该服务。即,当应用程序转到后台时,您的服务就会启动。