Android 应用被终止时的地理围栏
Android geofencing when app is killed
我的主要要求是让服务有自己的进程并触发自己的地理围栏事件。我希望用户在进入地理围栏时收到通知中心的通知,即使该应用已被终止。
我阅读了有关服务的内容,这对我来说似乎很清楚,Android 文档很密集,因此我设法了解了如何使用自己的进程启动服务,以及它如何能够与使用 Messenger 的应用程序。
Google 中的代码示例显示了如何将地理围栏与 google 播放服务结合使用:
Google samples geofencing
到目前为止,我发现我们必须使用 IntentService 来触发地理围栏事件,并且从我读过的文档中可以看出,IntentService 在其工作完成后自行终止。我也进行了一些测试,看起来当应用程序被杀死时 Intentservice 也被杀死了,这对文档来说并不让我感到惊讶。
所以我的问题是,我们如何执行具有自己进程的地理围栏服务?是否可以避免使用 IntentService 来解决这个问题?
编辑:
我想这样做的原因是用户可以设置地理围栏 "reminders",它基于日常使用。例如想象一下,每天你到达你的工作场所,当我们进入这个地理围栏时,我们应该能够发出警报(或通知)关于应用程序是否 运行。我们不希望用户担心应用程序 运行 在后台运行。
- 您不必为此目的使用单独的流程(除非您有其他未在此处大声说明的功能)
- 使用 WakefulBroadcastReceiver 确实非常适合处理地理围栏转换事件。
关于 Intentservice 你是对的,它在完成任务时被杀死。
但是有一种解决方法可以让您的服务即使在您的应用被终止后也能正常工作。
请删除您 Activity 提到位置代码的以下代码。
删除您提到的代码activity
检查你的 onPause()
@Override
protected void onPause() {
super.onPause();
//Comment out below code
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
}
检查您在 onStop() 中的代码
@Override
protected void onStop() {
super.onStop();
//Comment out the below code if you have done in your activity to disconnect from google api client.
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
在您的 Intentservice 中添加一些日志,您会看到当您 运行 您的应用程序经过上述修改后,您甚至可以在应用程序被杀死后获得位置更新。 :-)
我实际上是通过创建一个有自己的进程的服务来实现这一点的。这个服务绑定了IPC通信,我的activity然后在需要的时候注册到它
在此服务中,我确实应用了我在 google 示例中找到的地理围栏示例。它使用 IntentService 来触发地理围栏事件。我没有在我的 activity 中使用这个逻辑,而是在我自己的服务中使用它。现在即使我的应用程序被终止,我也可以收到通知。
我的主要要求是让服务有自己的进程并触发自己的地理围栏事件。我希望用户在进入地理围栏时收到通知中心的通知,即使该应用已被终止。
我阅读了有关服务的内容,这对我来说似乎很清楚,Android 文档很密集,因此我设法了解了如何使用自己的进程启动服务,以及它如何能够与使用 Messenger 的应用程序。
Google 中的代码示例显示了如何将地理围栏与 google 播放服务结合使用: Google samples geofencing
到目前为止,我发现我们必须使用 IntentService 来触发地理围栏事件,并且从我读过的文档中可以看出,IntentService 在其工作完成后自行终止。我也进行了一些测试,看起来当应用程序被杀死时 Intentservice 也被杀死了,这对文档来说并不让我感到惊讶。
所以我的问题是,我们如何执行具有自己进程的地理围栏服务?是否可以避免使用 IntentService 来解决这个问题?
编辑:
我想这样做的原因是用户可以设置地理围栏 "reminders",它基于日常使用。例如想象一下,每天你到达你的工作场所,当我们进入这个地理围栏时,我们应该能够发出警报(或通知)关于应用程序是否 运行。我们不希望用户担心应用程序 运行 在后台运行。
- 您不必为此目的使用单独的流程(除非您有其他未在此处大声说明的功能)
- 使用 WakefulBroadcastReceiver 确实非常适合处理地理围栏转换事件。
关于 Intentservice 你是对的,它在完成任务时被杀死。 但是有一种解决方法可以让您的服务即使在您的应用被终止后也能正常工作。
请删除您 Activity 提到位置代码的以下代码。
删除您提到的代码activity
检查你的 onPause()
@Override
protected void onPause() {
super.onPause();
//Comment out below code
LocationServices.FusedLocationApi.removeLocationUpdates(
mGoogleApiClient, this);
}
检查您在 onStop() 中的代码
@Override
protected void onStop() {
super.onStop();
//Comment out the below code if you have done in your activity to disconnect from google api client.
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
在您的 Intentservice 中添加一些日志,您会看到当您 运行 您的应用程序经过上述修改后,您甚至可以在应用程序被杀死后获得位置更新。 :-)
我实际上是通过创建一个有自己的进程的服务来实现这一点的。这个服务绑定了IPC通信,我的activity然后在需要的时候注册到它
在此服务中,我确实应用了我在 google 示例中找到的地理围栏示例。它使用 IntentService 来触发地理围栏事件。我没有在我的 activity 中使用这个逻辑,而是在我自己的服务中使用它。现在即使我的应用程序被终止,我也可以收到通知。