我不知道这是否可能,但我想做下一个:
想象一个应用程序有两个活动:MenuActivity和OtherPurposeActivity。
因此,在菜单的onCreate方法上,我已经运行了服务。在同一个活动(菜单)中,我可以很容易地"连接"(编辑:通信)与此服务没有问题。
然后,我单击MenuActivity上唯一的按钮,该按钮启动OtherPurposeActivity。问题来了:
我如何连接到我在菜单活动上运行的服务?这可能吗?(我没有调用stopService)。
提前感谢。
编辑:代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
/* Execute service */
Log.d("SERVICE", "Launching service");
Intent msgIntent = new Intent(MenuActivity.this, ServerProcessingService.class);
msgIntent.setAction(ServerProcessingService.ACTION_STATUS);
startService(msgIntent);
/* Connection to the IntentService */
IntentFilter filter = new IntentFilter();
filter.addAction(ServerProcessingService.ACTION_STATUS);
//filter.addAction(ServerProcessingService.ACTION_CONTROL);
rcv = new ProgressReceiver();
registerReceiver(rcv, filter);
}
所以我可以处理与ProgressReceiver类的通信。但是,如果我打开另一个活动,而该服务仍在运行怎么办?我可以使用它吗?
我如何连接到我在菜单活动上运行的服务?
另一个想要与服务通信的活动可以使用与MenuActivity完全相同的方法。startService()
只会在服务尚未运行的情况下启动服务,然后在所有情况下将意图发送给onStartCommand()
,因此从多个活动调用start service是正确的。
正如一位评论者指出的那样,如果你的活动需要与服务进行持续的通信,你应该绑定到它。
有可能吗?(我没有调用stopService)。
一个IntentService
将停止自己,如果它没有工作要做,所以它没有关系,你没有明确地停止它。如果服务需要继续运行,就不要使用intent服务。
为了保持一致,我将简要描述一下我是如何理解你的困境的。
您有一个IntentService
执行一些操作,最终提供一些结果。您在一个活动中启动此流程(当然是异步的),然后立即切换到另一个活动。现在,您不确定service是否会在切换到第二个Activity
之前完成工作,并且结果将丢失。
基本上,使用BroadcastReceiver
的方法将是一个不错的选择,但如果您不及时注册,数据将丢失,服务将结束它的工作。您可以让服务在结束之前将结果存储在数据库、文件甚至内存中(取决于数据类型)。当你的第二个活动开始时,你可以检查是否有数据等待你,如果没有,你可以等待BroadcastReceiver
交付它。
您也可以使用Otto库,这是比BroadcastReceiver
先进得多的解决方案。它允许将最后的结果返回给注册的观察者(Activity
),更重要的是,它将允许您的服务检查是否有观察者接收到消息。如果没有,则只能存储最后的结果