Android 使用PendingEvent存储应用程序状态的可靠性

Android 使用PendingEvent存储应用程序状态的可靠性,android,android-intent,android-pendingintent,Android,Android Intent,Android Pendingintent,我有一个服务,它首先创建一个新的意图,并对其调用setAction('foo')。在此之后,我调用putExtra(“key”,“value123”)。然后我调用pendingent.getService(this,999,intent,0)(未传递任何标志),并将挂起的intent传递给AlarmManager 但是,在警报触发之前(或者甚至在之后),我创建了另一个意图,并再次对其调用setAction('foo'),但不设置任何额外内容。 然后我再次将其传递给pendingent.getSe

我有一个服务,它首先创建一个新的意图,并对其调用
setAction('foo')
。在此之后,我调用
putExtra(“key”,“value123”)
。然后我调用
pendingent.getService(this,999,intent,0)
(未传递任何标志),并将挂起的intent传递给AlarmManager

但是,在警报触发之前(或者甚至在之后),我创建了另一个意图,并再次对其调用
setAction('foo')
,但不设置任何额外内容。 然后我再次将其传递给
pendingent.getService(this,999,intent,0)
。但是,这次我在PendingEvent上调用了
send()
,以便立即接收意图

我所观察到的是,最初的附加内容是以新的意图交付的。我似乎能够一遍又一遍地这样做,即使我的应用程序被终止,当我重新启动它时,额外的功能仍然存在


然而,我在文档中没有看到任何明确的内容,说明这是否是预期的行为。这是一种可靠的方法吗?如果我的应用程序被终止,我可以在RAM中保存少量数据(仅!)?目前我使用的是RAMdisk上的文件,但有些设备显然没有这样的功能。

这就是
pendingent
的工作方式;-)

第一次调用
pendingent.getService()
将创建一个新的
pendingent
,其中
requestCode
设置为999,而
Intent
设置为
ACTION=“foo”

第二次调用
pendingent.getService)
不会创建新的
pendingent
。它只返回第一个
pendingent
的令牌(引用)。在其上调用
send()
时,原始的
pendingent
将被发送

原因是,当您调用
pendingent.getService()
时,Android首先尝试查找与您指定的内容匹配的
pendingent
。为了确定
Intent
是否匹配,它会检查动作、组件、数据,并检查是否匹配
requestCode
参数。在您的情况下,对
pendingent.getService()
的两个调用具有相同的
requestCode
,而
Intent
具有相同的操作注意:在确定
意图是否匹配时,不考虑
意图中的“附加内容”

如果您总是想(重新)使用一个
pendingent
,并且每次使用它时都要覆盖“extras”,那么您可以将标记
pendingent.flag\u UPDATE\u CURRENT
添加到对
pendingent.getService()
的调用中


如果您需要使用不同的“额外功能”并行创建多个
pendingent
,则需要确保每次调用
pendingent.getService()
时使用唯一的
requestCode
,这就是
pendingent
的工作方式;-)

第一次调用
pendingent.getService()
将创建一个新的
pendingent
,其中
requestCode
设置为999,而
Intent
设置为
ACTION=“foo”

第二次调用
pendingent.getService)
不会创建新的
pendingent
。它只返回第一个
pendingent
的令牌(引用)。在其上调用
send()
时,原始的
pendingent
将被发送

原因是,当您调用
pendingent.getService()
时,Android首先尝试查找与您指定的内容匹配的
pendingent
。为了确定
Intent
是否匹配,它会检查动作、组件、数据,并检查是否匹配
requestCode
参数。在您的情况下,对
pendingent.getService()
的两个调用具有相同的
requestCode
,而
Intent
具有相同的操作注意:在确定
意图是否匹配时,不考虑
意图中的“附加内容”

如果您总是想(重新)使用一个
pendingent
,并且每次使用它时都要覆盖“extras”,那么您可以将标记
pendingent.flag\u UPDATE\u CURRENT
添加到对
pendingent.getService()
的调用中


如果您需要使用不同的“额外功能”并行创建多个
pendingent
s,则需要确保每次调用
pendingent.getService()

确定时都使用唯一的
requestCode
。更多的实验表明,如果PendingEvent未向AlarmManager注册,在某些情况下,额外的数据将丢失。我从未见过在注册时发生这种情况,因此唯一的差距是我是否可以通过使用相同的参数调用getService并执行立即发送()来始终从注册的PendingEvent获取额外内容。似乎总是有效的,但有保证吗?如果你将
pendingent
传递给另一个进程,那么Android将在其内部数据库中保留
pendingent
(及其“附加项”)。如果您创建了一个
pendingent
,但没有对它做任何操作,那么Android将删除它,因为没有对它的活动引用。也就是说,将数据保存在
pendingent
中并不能替代使用
SharedReferences
或其他一些持久性存储。还要注意,如果手机重新启动,所有的
挂起内容都会丢失。谢谢David。重新启动时失去状态是正常的;我关心的是,我需要我的
服务
始终根据请求为
活动
提供最新状态。如果服务被终止,它不能总是立即重新创建以前的状态(它通常必须等到收到新的传感器数据,这可能需要一段时间)。持久性(超越RAM)是不合适的,因为状态的刷新率很高,而这些状态通常都不会被使用(可能是