android如何比较挂起的意图
Posted
技术标签:
【中文标题】android如何比较挂起的意图【英文标题】:How does android compare pending intents 【发布时间】:2015-06-13 18:47:38 【问题描述】:PendingIntent.FLAG_NO_CREATE 的文档内容如下:
标志表示如果所描述的 PendingIntent 不存在,则简单地返回 null 而不是创建它。
我的问题:使用什么标准来比较 PendingIntents?
我猜这个标志使用PendingIntent.equals,但我不确定该函数使用什么标准。是在使用 action、requestCode、category、extras(我猜不是)等吗?
上下文:
如果我的闹钟尚未设置,我想启动一个带有待处理意图的闹钟。具体来说,我正在关注这个answer。
Intent i = new Intent(applicationContext, MyService.class);
i.setAction("myAction");
PendingIntent pi = PendingIntent.getService(applicationContext, /*requestCode*/0, i, PendingIntent.FLAG_NO_CREATE);
if (pi != null)
AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.AlarmService);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pi);
【问题讨论】:
好问题。我知道这是不对的。但是,我曾经取消以前的警报并在我认为需要时重新启动它。我期待这个问题的答案。 我猜它的 requestCode 而已。你不能访问源来检查它吗? android Studio 通常会显示它。 【参考方案1】:要确定 2 个PendingIntent
s 是否匹配,以下必须相等:
requestCode
创建 PendingIntent
时使用的参数
Intent
操作
Intent
类别
Intent
数据
Intent
MIMETYPE
Intent
包
Intent
组件
不考虑额外内容。
您可以在PendingIntent summary documentation 和Intent.filterEquals() 阅读更多内容。
【讨论】:
【参考方案2】:我猜这个标志使用 PendingIntent.equals,但是 我不太确定该函数使用的是什么标准。是否使用 action、requestCode、category、extras(我猜不是)等等?
其实提示在类描述中:
Intent 的描述和使用它执行的目标操作。 这个类的实例是用
创建的getActivity(android.content.Context,int,android.content.Intent,int), getActivities(android.content.Context,int,android.content.Intent[],int), getBroadcast(android.content.Context,int,android.content.Intent,int), getService(android.content.Context,int,android.content.Intent,int);
返回的对象可以交给其他应用程序,以便它们 以后可以代表您执行您描述的操作。
通过将 PendingIntent 提供给另一个应用程序,您正在授予它 执行您指定的操作的权利,如同其他人一样 应用程序是您自己(具有相同的权限和身份)。作为 因此,您应该注意如何构建 PendingIntent: 几乎总是,例如,您提供的基本 Intent 应该具有 组件名称显式设置为您自己的组件之一,以确保 它最终被发送到那里而不是其他任何地方。
PendingIntent 本身 只是对系统维护的令牌的引用,描述 用于检索它的原始数据。这意味着,即使它 拥有应用程序的进程被杀死,PendingIntent 本身将 仍然可以从已赋予它的其他进程中使用。如果 稍后创建应用程序重新检索相同类型的 PendingIntent (相同的操作、相同的 Intent 操作、数据、类别和组件, 和相同的标志),它将收到一个代表相同的 PendingIntent 如果令牌仍然有效,则可以调用 cancel() 将其删除。
由于这种行为,重要的是要知道两个 Intent 何时 出于检索 PendingIntent 的目的,被认为是相同的。 人们常犯的一个错误是创建多个 PendingIntent 具有仅在其“额外”内容上有所不同的意图的对象, 期望每次都能得到不同的 PendingIntent。这不 发生。 Intent 中用于匹配的部分是 Intent.filterEquals 定义的相同。如果你使用两个 Intent 根据 Intent.filterEquals 等效的对象,那么您将 为他们两个获得相同的 PendingIntent。
有两种典型的处理方法。
如果您确实需要多个不同的 PendingIntent 对象同时处于活动状态(如用作两个 同时显示的通知),那么您将 需要确保他们有一些不同之处 将它们与不同的 PendingIntent 相关联。这可能是任何 Intent.filterEquals 考虑的 Intent 属性,或不同 请求代码整数提供给 getActivity(android.content.Context,int,android.content.Intent,int), getActivities(android.content.Context,int,android.content.Intent[],int), getBroadcast(android.content.Context,int,android.content.Intent,int), 或 getService(android.content.Context,int,android.content.Intent,int)。
如果您一次只需要一个激活的 PendingIntent 用于任何 您将使用的意图,然后您可以选择使用标志 FLAG_CANCEL_CURRENT 或 FLAG_UPDATE_CURRENT 取消或修改 无论当前的 PendingIntent 与您的 Intent 相关联 供应。
来自: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/PendingIntent.java#PendingIntent
【讨论】:
我在问这个函数做了什么:“我猜这个标志使用PendingIntent.equals,但我不确定这个函数使用什么标准” 通常人们观看源代码是为了了解一些事情,这就是我向您展示它的原因。 我通常很欣赏答案中的源代码!帮助解释/支持答案通常很棒。但是我粘贴了指向您粘贴的代码的链接。我不理解该代码,因此我正在寻找解释,而不仅仅是我链接到的代码的副本/过去。 抱歉,我没有注意到方法的链接。我期待在您的问题中看到它的主体。 答案隐藏在您引用的大约 30 行文本中。如果你格式化它,我会给你支票。以上是关于android如何比较挂起的意图的主要内容,如果未能解决你的问题,请参考以下文章
单击 FCM 通知时,Flutter Notification 挂起的意图被取消
Android Appwidget textview没有更新
当应用程序被终止时并在后台使用 FusedLocationProviderClient 和挂起的 Intent 但在不规则时间获取位置