我不知道这是否可行,但我想做下一个:
想象一下有两项活动的应用:MenuActivity和OtherPurposeActivity。
因此,在菜单的onCreate方法中,我运行了服务。在同一个活动(菜单)中,我可以轻松地与此服务连接"(编辑:通信),没有任何问题。
然后,我单击MenuActivity上的唯一按钮,启动OtherPurposeActivity。问题出在这里:
如何连接我在MenuActivity上运行的服务?可能吗? (我没有调用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类的通信。但是,如果我打开另一个活动,这项服务仍在运行怎么办?我可以访问吗?
答案 0 :(得分:1)
如何连接我在MenuActivity上运行的服务?
另一个想要与服务通信的活动可以使用与MenuActivity完全相同的方法。 startService()
只会在服务尚未运行时启动服务,然后在所有情况下将意图发送到onStartCommand()
,因此可以从多个活动中调用启动服务。
正如评论者指出的那样,如果您的活动需要与服务进行持续的沟通,您应该绑定它。
有可能吗? (我没有打电话给stopService)。
IntentService
如果没有工作要做就会停止,所以你没有明确地停止它并不重要。如果服务需要继续运行,请不要使用意向服务。
答案 1 :(得分:0)
要在同一页面上,我将简要描述我如何理解你的困境。
你有一个IntentService
执行某些操作,最后会提供一些结果。您正在一个活动中启动此过程(当然是异步)并立即切换到另一个活动。现在,您不确定服务是否会在切换到第二个Activity
之前完成工作,结果将丢失。
基本上,使用BroadcastReceiver
的方法将是一个不错的选择,但如果您不按时注册,数据将会丢失,服务将终止它的工作。您可以让服务在结束之前,在DB,文件甚至内存中存储结果(取决于数据类型)。当您的第二个活动开始时,您可以检查是否有等待您的数据,如果没有,您可以等待BroadcastReceiver
发送。
您还可以使用Otto库,这是比BroadcastReceiver
更高级的解决方案。它允许返回注册观察者(Activity
)的最后结果,更重要的是它将允许您的服务检查是否有任何观察者收到了该消息。如果不是,那么你只能存储最后的结果。