【问题标题】:Simple ways to interact with services?与服务交互的简单方法?
【发布时间】:2012-12-28 16:48:36
【问题描述】:

是否有一些方法可以像内容提供者一样简单地与服务交互?

我的意思是,例如,对于内容提供商,我们有 getContentResolver():如果您有 Context,则可以轻松查询数据。您甚至不必担心跨进程调用的细节(ContentProvider)。

使用服务,您必须绑定它们,等待建立连接,然后如果您不想泄漏内存,请确保取消绑定它们。更糟糕的是,您必须与AIDL 处理远程服务。

举个例子:

我有一个文件下载器模块。目前有两种方法:内容提供者或服务。要开始每次新的下载,两者都很容易:

  • 服务:startService()。你只需要一个上下文。
  • 内容提供者:getContentResolver() 并将新下载插入其队列。您还只需要一个上下文。

但在下载过程中,我想获取一些信息(平均速度、完成百分比……)。问题就在这里:内容提供者更容易沟通。同样,您只需要一个上下文并查询您想要的信息。如果是服务,则需要绑定、解绑,或者构建自己的 AIDL(如果是远程服务)……

我问这个问题是因为在上面的例子中,服务似乎是优于内容提供者的正确方法,至少因为它的名称。

谢谢,

【问题讨论】:

  • 你打算如何处理“平均速度”、“完成百分比”信息?
  • @Squonk 我想在 UI 中显示它们以防用户想知道。

标签: android android-service android-contentprovider


【解决方案1】:

我建议这样做的两种方法...

首先是尝试使用实现ParcelableResultReceiver

基本上创建您自己的扩展ResultReceiver 的类,然后在您从Activity 传入startService(Intent intent)Intent 上调用putExtra(String name, Parceable value。然后Service 可以在ResultReceiver 上使用send(int resultCode, Bundle resultData) 将数据发回。如果ResultReceiverActivity 的内部类,它将能够与其UI 交互。

第二种可能性是通过FLAG_ONGOING_EVENT 标志使用Notifications。这显然不会出现在Activity 本身,但会出现在Notification 栏中,但是您可以创建一个自定义RemoteView,并在每个更新的通知中更新文本等。这类似于您在 Google Play 在您的设备上安装或更新应用时看到的情况。

【讨论】:

  • 惊人的答案。太感谢了。你用 ResultReceiver 为我节省了一天的时间,尤其是它在 API 3+ 中可用。谢谢:-)
  • 很高兴为您提供帮助。我自己使用ResultReceiverServiceActivity 之间进行通信。效果很好。
  • @LaiVung :对于下载,请查看IntentService - 它创建自己的工作线程,并在完成工作后自行终止。见 - developer.android.com/reference/android/app/IntentService.html
  • 谢谢。我还需要重写一些服务以使用IntentService :-D 有很多东西要学。
  • @LaiVung : 我的一个朋友曾经说过“乐趣在于学习”。这就是我们做这些事情的原因。祝好运并玩得开心点。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多