我需要创建一个活动来启动监控用户位置的服务,并且在某个区域内允许调用Activity更新其视图以通知用户。
由于有几种不同的方式来处理服务,我有点困惑,哪一种对我的情况是正确的。
使用startService()
和stopService()
方法:根据我的理解,我无法直接与开始活动对话。在谷歌文档中有一个example显示如何通过PendingIntent将BroadcastReceiver传递给服务并调用它,但我认为不允许我更新正在运行的活动的视图...或者它会?
绑定服务:从文档看来,这将允许服务和活动之间的双向通信,但也提到绑定服务不在后台运行{{ 3}}。现在我不需要甚至不想让服务无限期地运行,但在最糟糕的情况下,我可能需要它在bg中运行至少一两个小时而不会被杀死。
第三个(可能不是那么好)选项:在活动的线程中运行位置服务,这将使实时视图更新变得容易,然后在onPause事件中,停止位置服务在活动中,通过startService()
将其移交给服务,并使用通知服务在输入定义的区域时提醒用户。
非常感谢任何建议。
如果您希望服务返回结果,则启动服务的客户端可以为广播创建PendingIntent(使用getBroadcast())并将其传递给启动服务的Intent中的服务。然后,该服务可以使用广播来传递结果。
和this说
绑定服务通常只在服务于另一个应用程序组件时才存在,并且不会无限期地在后台运行。
答案 0 :(得分:8)
您可以拥有一个既受约束又通过startService()
启动的服务。使用ServiceConnection
,您可以进行双向通信,并使用startService()/stopService()
来控制它的生命周期。
来自android网站的生命周期图像真的很好地解释了它:
通过绑定和启动服务,您将获得可以无限期运行的服务。只有满足以下两个条件时,服务才会停止:
它需要更多的维护,但我发现这是最合理的选择。
答案 1 :(得分:5)
啊,选项(2)可能就是你想要的。您可以覆盖onStartCommand
以返回START_STICKY
,服务将在活动完成后继续运行。
当你bindService
时,你可以获得实际的Service实例,然后只需调用你的自定义方法作为一种沟通方式。或者,您可以使用其中一个示例here
答案 2 :(得分:1)
与服务绑定将是最好的方法。
将此代码放在您的活动onCreate中,并通过实现返回binder对象的onBind方法来定义您的服务。在您的服务中正确定义您的IBinder。
这将确保服务在后台始终运行。每次您的活动开始时,它都会与服务绑定。在您的活动的onDestroy()方法解除绑定服务。否则会抛出ServiceLeakedException。
YourService service;
ServiceConnection serviceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName name, IBinder binderService) {
service = ((YourService.ServiceBinder)binderService).getService();
}
public void onServiceDisconnected(ComponentName name) {
}
};
// ... and bind.
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
根据任何计算,您的服务可以自行启动您的活动。随着它的推出,它将与服务绑定。然后可以进行进一步的沟通。
希望有所帮助:)