android如何比较未决意图

时间:2015-04-08 17:03:44

标签: android android-intent alarmmanager android-pendingintent

PendingIntent.FLAG_NO_CREATE的文档读取:

  

表示如果描述的PendingIntent尚不存在的标志,则只返回null而不是创建它。

我的问题:使用什么标准来比较PendingIntents?

我猜测这个标志使用PendingIntent.equals,但我不确定该函数使用的标准。是使用action,requestCode,categories,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);
}

2 个答案:

答案 0 :(得分:24)

要确定2 PendingIntent是否匹配,以下内容必须相同:

  • 创建requestCode时使用的PendingIntent参数
  • Intent行动
  • Intent类别
  • Intent数据
  • Intent MIMETYPE
  • Intent PACKAGE
  • Intent COMPONENT

不考虑额外内容。

您可以在PendingIntent summary documentationIntent.filterEquals()中阅读更多内容。

答案 1 :(得分:2)

  

我猜测这个标志使用了PendingIntent.equals,但是   我不确定该功能使用的标准。它是否正在使用   动作,requestCode,类别,演员(我猜不是)等等?

实际上提示是在课堂描述中:

  

要对其执行的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   具有Intent的对象只有在" extra"内容,   期望每次获得不同的PendingIntent。事实并非如此   发生。用于匹配的Intent部分是   由Intent.filterEquals定义的相同内容。如果你使用两个Intent   根据Intent.filterEquals等效的对象,那么你会   为他们两个获得相同的PendingIntent。

     

有两种典型的方法可以解决这个问题。

     

如果你真的需要多个不同的   PendingIntent对象同时处于活动状态(例如用作两个   同时显示的通知),然后你会   需要确保有一些与他们不同的东西   将它们与不同的PendingIntents相关联。这可能是任何一个   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与您的意图相关联   供给。

自: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/PendingIntent.java#PendingIntent