为什么我不能追求意图而不是未决意图?

时间:2014-04-04 06:09:27

标签: android android-intent

我是android的新手,当我搜索发送短信的代码时,我发现他使用了一个待定的意图并开始学习它,我研究了它被第三方应用程序用于启动意图而且还需要未来的行动,但我不明白这些是如何工作的?无论如何,无论何时调用待处理的意图,它都会调用一个意图,所以为什么我们不直接去寻求意图呢?

我希望这个问题很清楚,如果可能的话,请给我一些使用意图和待定意图的例子,请不要再解释我的定义....

2 个答案:

答案 0 :(得分:1)

  

为什么我不能用意图而不是待定意图?

您需要提供PendingIntent而不是Intent的原因:

1)让我们假设你给了另一个应用程序Intent,以便该应用程序以某种方式使用它(例如 - 系统通知管理器是另一个应用程序)。现在考虑一下 - 这个应用程序如何知道这个意图是用于启动Activity还是打算开始Service或发送brodcast?回答:它不能!您可能认为它可以根据类参数知道,但不要忘记它也可以启动implicit Activities /服务!

结论:其他应用程序无法知道该Intent的确切内容,而不知道它的目的是什么。这就是创建PendingIntent时使用getBroadcast()getActivity()getService()方法创建PendingIntent的原因。

PendingIntent之一就是:封装Intent +如何处理它。

2)让我们假设您想在一段时间后向该应用程序提供另一个Intent。现在,有两个选项:

  • 新的Intent应该替换您提供的前一个
  • 新意图不应取代之前的意图..

接收应用程序将如何知道两者中的哪一个?

回答:由系统保留和创建的未决意图,并通过提供filter equal到另一个和相同请求代码的待定意图 - 将自动替换之前的意图而不创建新的意图。

3)让我们假设对意图的引用是由您的应用程序直接保存和创建的,而不是由系统保存(正如我在' 2'中所写)。现在想象一下这个场景:

3.1)您的应用程序创建了意图对象

3.2)您的应用程序将该intent对象的引用提供给另一个applciation

3.3)您的申请流程因某种原因而停止

3.4)WTF应该发生?引用另一个应用程序持有的应用程序对象???这对GC来说是一团糟。由于这个原因,系统无法释放您的进程内存分配!

这是场景未决的意图实例背后的第二个原因,仅由系统保存,而不是由您的特定应用程序保存。

如果还不够 - 还有安全问题......

我不会写你的用法示例,因为谷歌搜索PendingIntent turorial会产生很好的例子,但无论如何 - 代码对于特定的用例会有所不同......

答案 1 :(得分:0)

主要区别在于,即使PendingIntent的拥有应用程序的进程被终止,PendingIntent本身也将保持可用于其他进程。 如果创建应用程序稍后重新检索相同类型的PendingIntent,它将接收表示相同的PendingIntent,如果它仍然有效,并且还可以调用cancel()来删除它(实际上是前一个)。