我有一项服务,我开始使用
Intent serviceIntent = new Intent(getActivity().getApplicationContext(), LocationService.class);
getActivity().startService(serviceIntent);
当应用进入后台时,未关闭,只是不在前台:即按主页按钮,我这样做:
Notification notification = mBuilder.build();
service.startForeground(NOTIFICATION, notification);
将服务带到前台并显示持续通知。
点击通知的关闭操作时会触发BroadcastReceiver
(添加了通知操作)。
BroadcastReceiver
停止服务:
@Override
public void onReceive(Context context, Intent intent) {
Intent serviceIntent = new Intent(context.getApplicationContext(), LocationService.class);
context.stopService(serviceIntent);
}
现在,有两种情况:
当应用进入后台但未关闭时,当下拉通知栏并点击关闭操作时 - >服务的onDestroy
被称为正常。我可以看到来自Toast
的{{1}}和Log
条消息。
当应用关闭时(从应用列表中删除),意味着只有服务正在运行,在下拉通知栏并点击关闭操作时 - > 它不会看起来像服务onDestroy
被调用!那里的代码没有执行,我 cant 看到来自onDestroy
的{{1}}和Toast
条消息。
然而,似乎服务确实停止了,因为我可以看到该应用已从设置中移除 - >点击关闭后,运行应用。
那么,服务会被破坏吗?如果是这样,为什么Log
中的代码不会被执行?
如何确保调用onDestroy
?
显然,它与好的"这个事实有关。场景,应用程序仍然在后台,并在"坏"方案,应用程序已关闭。
修改
感谢CommonsWare和John Leehey的评论,我明白可能会终止"过程"并且"没有保证"将调用onDestroy
。
我的onDestroy
看起来像这样:
onDestory()
我应该在其他地方执行onDestory
和@Override
public void onDestroy() {
super.onDestroy();
stopLocationUpdates();
googleApiClient.disconnect();
Foreground.get(this).removeListener(this);
// set default zoom
sharedPrefrencesManager.putFloat(getString(R.string.zoom_last_location_key), 15);
Log.i("test", "onDestroy");
}
之类的操作吗?因为无法保证stopLocationUpdates();
被调用?