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)是不合适的,因为状态的刷新率很高,而这些状态通常都不会被使用(可能是