IntentService在Intents之间工作

时间:2014-08-16 16:12:59

标签: android android-activity service communication intentservice

我不知道这是否可行,但我想做下一个:

想象一下有两项活动的应用: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类的通信。但是,如果我打开另一个活动,这项服务仍在运行怎么办?我可以访问吗?

2 个答案:

答案 0 :(得分:1)

  

如何连接我在MenuActivity上运行的服务?

另一个想要与服务通信的活动可以使用与MenuActivity完全相同的方法。 startService()只会在服务尚未运行时启动服务,然后在所有情况下将意图发送到onStartCommand(),因此可以从多个活动中调用启动服务。

正如评论者指出的那样,如果您的活动需要与服务进行持续的沟通,您应该绑定它。

  

有可能吗? (我没有打电话给stopService)。

IntentService如果没有工作要做就会停止,所以你没有明确地停止它并不重要。如果服务需要继续运行,请不要使用意向服务。

答案 1 :(得分:0)

要在同一页面上,我将简要描述我如何理解你的困境。

你有一个IntentService执行某些操作,最后会提供一些结果。您正在一个活动中启动此过程(当然是异步)并立即切换到另一个活动。现在,您不确定服务是否会在切换到第二个Activity之前完成工作,结果将丢失。

基本上,使用BroadcastReceiver的方法将是一个不错的选择,但如果您不按时注册,数据将会丢失,服务将终止它的工作。您可以让服务在结束之前,在DB,文件甚至内存中存储结果(取决于数据类型)。当您的第二个活动开始时,您可以检查是否有等待您的数据,如果没有,您可以等待BroadcastReceiver发送。

您还可以使用Otto库,这是比BroadcastReceiver更高级的解决方案。它允许返回注册观察者(Activity)的最后结果,更重要的是它将允许您的服务检查是否有任何观察者收到了该消息。如果不是,那么你只能存储最后的结果。