【问题标题】:Maintain list of PendingIntents, persist past owning object's lifecycle维护 PendingIntents 列表,坚持拥有对象的生命周期
【发布时间】:2017-01-25 15:46:52
【问题描述】:

我有一个数据对象,它偶尔会使用重复警报从网络上的数据源刷新。

此数据对象跟踪希望在获得新数据时得到通知的对象。我目前使用两种方法来注册侦听器 - 如果他们希望仅在应用程序处于前台时刷新,他们可以注册为回调,或者如果需要通知观察对象,他们可以注册 PendingIntent,即使应用未激活。

我的问题是,如果我的数据对象从内存中删除,那么它的 PendingIntents 列表也会被删除。我想我可以想出一个复杂的方法来将列表和其中的所有字段保存在共享首选项或其他东西中,但我认为必须有更好的方法。

有没有一种方法可以让我知道系统拥有自己的 PendingIntent 列表,以获取所有“我的”PendingIntent?

请注意,我无法在创建对象时或在任何其他时间重新创建 PendingIntents - 它们是由侦听器创建的,并且无法推断它们设置了哪些字段或它们的值。

【问题讨论】:

  • “我想我可以想出一个复杂的方法来将列表和其中的所有字段保存在共享首选项或其他东西中”——不。 “它们是由监听器创建的,无法推断出它们设置了哪些字段或它们的值”——如果这些监听器在您的应用程序中,您为什么首先使用PendingIntents?如果这些侦听器不在您的应用程序中,那么它们就不是您的 PendingIntents(关于“对于所有 '我的'PendingIntents”)。
  • @CommonsWare:我的意图是使用 PendingIntent 通知我的其他应用程序组件来更新他们的显示或当我的数据对象刷新时他们想要做的任何事情。如果用户当时没有与应用程序交互,我还有什么其他方法可以通知我的应用程序组件有新数据可用?在这种特殊情况下,我正在更新 appWidgets 之类的东西,它显示数据并检查是否应该发出通知。
  • “我还有什么其他方法可以通知我的应用组件有新数据可用?” -- 嗯,调用 Java 对象的方法?如果您担心的是紧耦合,请使用事件总线。 “我正在更新 appWidgets 之类的东西,它显示数据并检查是否应该发出通知”——使用 AppWidgetManager 来更新应用小部件。更新应用小部件不需要PendingIntent
  • @CommonsWare:你似乎误解了我的用例。数据对象不知道哪些组件需要更新,所以我不能只列出它们并进行调用。当应用程序在内存中时,我可以注册侦听器并对其进行调用,但是当它被系统删除时,我的侦听器列表就消失了。这就是促使我使用 PendingIntents 的原因。
  • “数据对象不知道哪些组件需要更新,所以我不能只列出它们并进行调用”——使用事件总线或 RxJava。 “这就是促使我使用 PendingIntents 的原因”——AFAIK,PendingIntent 是引用计数的,一旦没有使用它就会被删除。另外,您无法取回“您的”PendingIntents,除非重新创建它们。

标签: android android-intent android-pendingintent


【解决方案1】:

看看这些Storage Options

以前我不得不使用挂起的意图来安排警报。当设备重新启动时,操作系统会删除所有警报,因此我必须在操作系统完成启动后重新创建它们。

要确定两个 PendingIntent 是否匹配,以下条件必须相等:

  • 创建 PendingIntent 时使用的 requestCode 参数
  • 意图行动
  • 意图类别
  • 意图数据
  • 意图 MIMETYPE
  • 意图包
  • 意图组件

不考虑额外内容。

因此,我将此信息存储到 RelationalDatabase(在我的情况下为 Realm),并可以在以后“重新创建”待处理的意图。

另外,看看this answer。和你的很像。

【讨论】:

    【解决方案2】:

    听起来很复杂,可能不可能(使用PendingIntent)。

    为什么不直接在广播Intent 中广播对对象的更改。这样您就不必跟踪任何听众。任何想要监听对象变化的组件都可以为适当的广播Intent注册一个监听器。

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 2012-05-19
      • 2014-08-20
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      相关资源
      最近更新 更多