我想要定义一个URI,例如:
myapp://path/to/what/i/want?d=This%20is%20a%20test
必须由我自己的应用程序或服务处理。请注意,该方案为"myapp"
而非"http"
或"ftp"
。这正是我的意图:为Android OS全局定义自己的URI架构。这可能吗?
这有点类似于某些程序已经在做的事情,例如Windows系统,例如Skype(skype://
)或任何种子下载程序(torrent://
)。
答案 0 :(得分:207)
这是非常可能的;您可以使用<data>
元素在AndroidManifest.xml中定义URI方案。您设置了填充了<data>
元素的intent过滤器,您将能够创建自己的方案。 (More on intent filters and intent resolution here。)
这是一个简短的例子:
<activity android:name=".MyUriActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="path" />
</intent-filter>
</activity>
根据隐含意图的工作原理,您还需要定义至少一个动作和一个类别;在这里我选择了VIEW作为动作(虽然它可以是任何东西),并确保添加DEFAULT类别(因为这是所有隐含意图所必需的)。另请注意我是如何添加类别BROWSABLE的 - 这不是必需的,但它允许您的URI可以从浏览器打开(一个漂亮的功能)。
答案 1 :(得分:63)
补充@DanielLew答案,获取必须执行的参数值:
URI示例:myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo
在您的活动中:
Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
Uri uri = intent.getData();
String valueOne = uri.getQueryParameter("keyOne");
String valueTwo = uri.getQueryParameter("keyTwo");
}
答案 2 :(得分:25)
我强烈建议您不要定义自己的方案。这违背了URI方案的Web标准,它试图严格控制这些名称,以避免不同实体之间的名称冲突。一旦你在网站上放置了你的方案的链接,你就把这个小名字放在整个互联网的命名空间中,并且应该遵循这些标准。
如果您只想拥有自己应用的链接,我建议您按照我在此处描述的方法进行操作:
答案 3 :(得分:6)
Diego的另一种替代方法是使用库:
https://github.com/airbnb/DeepLinkDispatch
您可以轻松声明您要处理的URI以及您希望通过活动上的注释提取的参数,例如:
Kind
作为一个加号,查询参数也将传递给Activity。
答案 4 :(得分:0)
正如几年前所提的那样,Android在此URI方案上得到了很大发展。
从原始的URI方案到深层链接,再到现在的Android App链接。
Android现在建议使用HTTP URL,而不是定义自己的URI方案。由于Android应用程序链接使用链接到您拥有的网站域的HTTP URL,因此没有其他应用程序可以使用您的链接。您可以从here
检查深层链接和Android App链接的比较现在,您可以使用Android Studio选项轻松添加URI方案:工具>应用链接助手。 请参考Android文档中的详细信息:https://developer.android.com/studio/write/app-link-indexing.html