0

我只是在学习使用服务,有点卡住了。

我有一个IntentService用于下载文件队列的文件。我有一个Activity能够打开和关闭应该下载哪些文件的功能。文件下载完成后,我在SharedPreferences. 我有两个问题/问题:

  1. 启动 Service 的原始 Activity 很可能会消失,但很有可能该 Activity 的新实例已经启动。在这种情况下,我需要向该 Activity 发送一条消息以检查 SharedPreferences 并相应地更新它的 UI。因此我的问题是:如何向可能正在运行或未运行的活动发送消息?

  2. 活动可以在服务运行时打开和关闭应下载的文件。这造成了几种情况。如果服务未运行并且文件已打开,那么我想将此文件添加到它的队列中来启动它。如果服务正在运行并且文件被打开,那么我只想将文件添加到它的队列中。如果服务没有运行并且文件被关闭,我已经有了删除它的方法。但是,如果服务正在运行并且尚未下载文件,我想将其从队列中删除,或者如果它当前正在下载它,则停止下载它。我在我的 SharedPreferences 中保留了应该下载的文件,所以我想所有这些都可以通过向服务发送消息来检查 SharedPreferences 来涵盖。这就引出了我的第二个问题:如果服务正在运行,我如何获得,如果是,向它发送消息?

4

4 回答 4

3

您可能想要的是某种绑定服务。 http://developer.android.com/guide/topics/fundamentals/bound-services.html 您可以向它发送消息并从中接收消息。因此,当您的活动再次启动时,它可以再次绑定到服务并在下载完成时接收回调。此外,活动可以向服务发送消息以开始或停止下载。好的部分:当你绑定到它并且它还没有运行时,服务就会启动。

希望这有帮助:)

于 2012-06-16T18:44:46.937 回答
1

您的问题 1 和问题 2 的可能答案:

使用广播接收器:http: //developer.android.com/reference/android/content/BroadcastReceiver.html

对于问题 1:您可以将您的活动注册到您将定义的某种接收器,并在您想要广播时发送。如果活动已注册到广播 - 它会接收它...

对于问题 2:相同的答案:将您的服务注册到特殊广播代表您要传递给该服务的消息。如果它没有运行(并且没有注册到广播) - 那么什么都不会发生。

于 2012-06-16T19:07:33.117 回答
1

用于LocalBroadcastManager发送意图,它们将留在应用程序范围内,然后在活动中使用广播接收器。

于 2013-11-07T14:57:41.980 回答
0
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager
            .getRunningServices(Integer.MAX_VALUE)) {
        if ("com.pkg.PlayerService".equals(service.service
                .getClassName())) {
            isrunning = true;
            ;
        }
    }
    return isrunning;

运行此代码可为您提供服务状态。您可以在您的 intentService 的 onDestroy() 中登录并检查您的服务何时停止。

于 2012-06-16T19:09:21.760 回答