【发布时间】:2014-04-04 06:09:27
【问题描述】:
我是 android 的新手,当我搜索发送短信的代码时,我发现他使用了一个挂起的意图并开始了解它,我研究了它被 3rd 方应用程序用来启动意图,而且它需要未来的行动,但我不明白这些是如何运作的?无论如何,将来每当一个待处理的意图被调用时,它都会调用一个意图,那么为什么我们不直接去寻求意图呢?
我希望问题很清楚,所以如果可能的话,请给我使用意图和待定意图的示例,请不要再向我解释定义......
【问题讨论】:
我是 android 的新手,当我搜索发送短信的代码时,我发现他使用了一个挂起的意图并开始了解它,我研究了它被 3rd 方应用程序用来启动意图,而且它需要未来的行动,但我不明白这些是如何运作的?无论如何,将来每当一个待处理的意图被调用时,它都会调用一个意图,那么为什么我们不直接去寻求意图呢?
我希望问题很清楚,所以如果可能的话,请给我使用意图和待定意图的示例,请不要再向我解释定义......
【问题讨论】:
为什么我不能选择意图而不是待定意图?
您需要提供PendingIntent 而不是Intent 的原因:
1) 假设您为另一个应用程序提供了Intent,以便该应用程序以某种方式使用它(例如 - 系统通知管理器是另一个应用程序)。现在想一想——这个应用程序如何知道这个意图是打算启动Activity还是打算启动Service或发送广播?答:不能!你可能认为它可以根据类参数知道,但不要忘记它也可以启动implicit Activities/Services!
结论:如果不知道它的用途,其他应用程序无法知道该 Intent 的确切用途。这就是为什么在创建 PendingIntent 时使用 getBroadcast() 或 getActivity() 或 getService() 方法创建它的原因。
这就是PendingIntent 的全部意义之一:封装Intent + 如何处理它。
2) 假设您想在一段时间后向该应用程序提供另一个 Intent 。现在,有两种选择:
接收应用程序如何知道两者中的哪一个?
答案:挂起的意图由系统持有和创建,并通过将filter equal 的挂起意图提供给另一个相同的请求代码 - 将自动替换前一个而不创建新的。
3) 假设对意图的引用是由您的应用程序直接保存和创建的,而不是由系统保存和创建的(正如我在“2”中所写的那样)。现在想象一下这个场景:
3.1) 您的应用程序创建了意图对象
3.2) 您的应用程序将该意图对象的引用提供给另一个应用程序
3.3) 你的申请进程由于某种原因停止了
3.4) WTF 应该发生吗?引用另一个应用程序持有的应用程序对象???这对GC来说是一团糟。因此,系统无法释放您的进程内存分配!
这是场景挂起意图实例仅由系统而非您的特定应用程序持有的第二个原因。
如果这还不够——还有安全问题……
我不会给你写用法示例,因为任何对 PendingIntent turorial 的谷歌搜索都会得到很好的示例,而且无论如何 - 对于特定的用例,代码会有所不同...
【讨论】:
主要区别在于,即使拥有应用程序的 PendingIntent 进程被杀死,PendingIntent 本身仍可用于其他进程。 如果创建应用程序稍后重新检索相同类型的 PendingIntent,它将收到一个表示相同的 PendingIntent,如果它仍然有效,并且还可以调用 cancel() 将其删除(实际上是前一个)。
【讨论】: