我有一个关于接近警报的问题。 在我读过的所有教程中,它们是在创建它们的活动仍在运行时创建和销毁的。 但是,如果说一个活动创建了 n 个邻近警报,然后活动本身被破坏(PA 不是),会发生什么情况
然后,如果我想构建另一个活动来查找这些邻近感应警报,我该怎么做?这可能吗?
您必须维护自己的邻近警报列表。没有办法让他们回来。但是,当他说您可以仅使用挂起的意图删除 PA 时,@Mercato是正确的,但您不必存储它们。根据文档:
悬而未决的意图本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使其所属应用程序的进程被终止,PendingIntent 本身仍将可用于已赋予它的其他进程。如果创建应用程序稍后重新检索相同类型的 PendingIntent(相同的操作、相同的 Intent 操作、数据、类别和组件以及相同的标志),它将收到表示相同令牌的 PendingIntent(如果该令牌仍然有效),因此可以调用 cancel() 将其删除。
这意味着系统将在应用重启之间为您存储PendingIntent
,您可以通过传递用于创建它的相同Intent
来检索它。例如,如果您创建了以下PendingIntent
:
Intent intent = new Intent(context, Foo.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
然后,您只需存储requestId
(1)和Class
或类名(Foo.class
或Foo.class.getName()
)。然后,如果要在不创建新PendingIntent
的情况下检索同一,则可以执行以下操作:
Class<Foo> className = retrieveClass(); //You implement this
//String clazz = retrieveClassName(); //This is another option
int requestId = retrieveId(); //You implement this
Intent intent = new Intent(context, className);
//The flag given attempts to retrieve the PendingIntent if it exists, returns null if it doesn't.
PendingIntent pi = PendingIntent.getBroadcast(context, requestId, intent, PendingIntent.FLAG_NO_CREATE);
if (pi != null) {
//This pending intent was registered once before.
//Go ahead and call the function to remove the PA. Also, go ahead and call pi.cancel() on this.
}
else {
//This pending intent was not registered, and therefore can't have a PA registered to it.
}
从技术上讲,所有邻近警报都需要定义一个PendingIntent
并将其用作参数。Android的文档显示,如果您知道PendingIntent
的列表,那么您也可以删除它们。
删除邻近警报(挂起的意图意图) 删除邻近警报 具有给定的待定意图。
由于PendingIntent
Parecelable
在此处看到,因此您可以将其作为Extra
添加到任何Intent
。这意味着,在启动另一个活动时,您可以创建一个Parcelable[]
数组来保存所有这些PendingIntent
,然后
putExtra(字符串名称,可包裹[] 值) 向目的添加扩展数据。
然后通过getIntent()
及其相关方法在下一个活动中检索它们。