我是android的新手,当我搜索发送短信的代码时,我发现他使用了一个待定的意图并开始学习它,我研究了它被第三方应用程序用于启动意图而且还需要未来的行动,但我不明白这些是如何工作的?无论如何,无论何时调用待处理的意图,它都会调用一个意图,所以为什么我们不直接去寻求意图呢?
我希望这个问题很清楚,如果可能的话,请给我一些使用意图和待定意图的例子,请不要再解释我的定义....
答案 0 :(得分:1)
为什么我不能用意图而不是待定意图?
您需要提供PendingIntent
而不是Intent
的原因:
1)让我们假设你给了另一个应用程序Intent
,以便该应用程序以某种方式使用它(例如 - 系统通知管理器是另一个应用程序)。现在考虑一下 - 这个应用程序如何知道这个意图是用于启动Activity
还是打算开始Service
或发送brodcast?回答:它不能!您可能认为它可以根据类参数知道,但不要忘记它也可以启动implicit Activities /服务!
结论:其他应用程序无法知道该Intent的确切内容,而不知道它的目的是什么。这就是创建PendingIntent时使用getBroadcast()
或getActivity()
或getService()
方法创建PendingIntent的原因。
PendingIntent
之一就是:封装Intent
+如何处理它。
2)让我们假设您想在一段时间后向该应用程序提供另一个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()来删除它(实际上是前一个)。