我想创建一个Intent-Filter,以便某些链接将触发我的应用程序的启动(请参阅此stackoverflow-thread,例如:How to register some URL namespace (myapp://app.start/) for accessing your program by calling a URL in browser in Android OS?)
尝试时,我想,我不太明白Intents和Intent-Filters(在Manifest.xml中定义)实际上是如何工作的。以下是什么区别:
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
或以下:
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MAIN" />
实际上,类别和动作Intent-Filters之间的区别是什么。我读了这页http://developer.android.com/reference/android/content/Intent.html,但我仍然缺少基本的理解。
答案 0 :(得分:89)
不要从你的应用程序的角度来看它,而是翻转它并从Intent方面看它。
创建Intent时,创建者不知道系统上有哪些应用程序来处理Intent。但是创建者确实知道它想要做什么(例如,应用程序可能希望让用户从设备上的某个位置挑选联系人),并且需要联系系统上的其他应用程序以询问所需的内容。 / p>
为此,Intents会附加几条信息。其中包括行动和类别。
动作以一般方式定义Intent想要执行的操作,例如查看联系人,从图库中选取图像等。
该类别是另一条信息,它为Intent提供了另一种区分自身的方式。例如,当单击浏览器中的链接时,创建的Intent附加了BROWSABLE类别。
因此,当操作系统解析Intent时,它将查找具有意图过滤器的已注册活动或BroadcastReceiver,其中包含所有信息。如果Intent指定了PICK操作,那么没有具有PICK操作的intent-filter的活动将从候选列表中被丢弃以处理Intent。
通过这种方式,与Intent关联的动作,类别,类型和(可能)方案的组合用于精确定位可以处理Intent的活动集。在清单中设置intent-filter时,您告诉操作系统您可以处理哪类意图。
答案 1 :(得分:2)
我必须检查android.content.IntentFilter.matchCategories(Set<String> categories)
的代码以了解类别的匹配:
特别是#1和#3并不明显。