我只是学习使用服务,而且有点卡住了。
我有一个IntentService
用于下载文件队列。我有一个Activity
,可以打开和关闭应下载的文件。文件下载完成后,我在SharedPreferences
更新一个布尔值。我有两个问题/问题:
启动服务的原始活动很可能已经消失,但很可能已启动该活动的新实例。在这种情况下,我需要向该Activity发送一条消息来检查SharedPreferences并相应地更新它的UI。我的问题是:如何向可能正在运行或未正在运行的活动发送消息?
活动可以在服务运行时打开和关闭应下载哪些文件。这会产生一些情况。如果服务未运行且文件已打开,那么我想将此文件添加到其队列中启动它。如果服务正在运行并且文件已打开,那么我只想将文件添加到其队列中。如果服务未运行且文件被关闭,我已经有了删除它的方法。但是,如果服务正在运行且尚未下载文件,我想将其从队列中删除,或者如果当前正在下载该文件,则停止下载。我保留了应该在我的SharedPreferences中下载的文件,所以我猜所有这些都可以通过向服务发送消息以检查SharedPreferences来实现。这导致了我的第二个问题:如果服务正在运行,我该如何获得,如果是,请发送消息?
答案 0 :(得分:3)
你可能想要的是某种绑定服务。 http://developer.android.com/guide/topics/fundamentals/bound-services.html 您可以向其发送消息并从中接收消息。 因此,当您的活动再次启动时,它可以再次绑定到服务并在下载完成后接收回调。 此外,活动可以向服务发送消息以启动或停止下载。 好的部分:当你绑定它并且它还没有运行时,服务就会启动。
希望这有助于:)
答案 1 :(得分:1)
可能回答您的问题1和问题2:
使用broadcastReceivers:http://developer.android.com/reference/android/content/BroadcastReceiver.html
问题1:您可以将您的活动注册到您定义的某种接收器,并在您希望广播时发送。如果活动已注册到广播 - 它会收到它......
问题2:同样的答案:将您的服务注册到特殊广播代表您要传递给服务的消息。如果它没有运行(并没有注册到广播) - 那么什么都不会。
答案 2 :(得分:1)
使用LocalBroadcastManager
发送意图,它们将保留在应用范围内,然后在活动中使用广播接收器。
答案 3 :(得分: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;
运行此代码可以提供服务状态.U可以登录u r intentService的onDestroy()并检查服务何时停止。