如何在Android上实现我自己的URIscheme

假设我想定义一个URI,例如:

myapp://path/to/what/i/want?d=This%20is%20a%20test 

必须由我自己的应用程序或服务来处理。 请注意,该scheme是"myapp"而不是"http""ftp" 。 这正是我的意图:为Android OS定义我自己的全球URI模式。 这可能吗?

这有些类似于某些程序已经在做什么,例如Windows系统,如Skype( skype:// )或任何torrent下载程序( torrent:// )。

这是非常可能的; 您可以使用<data>元素在AndroidManifest.xml中定义URIscheme。 你用<data>元素填充了一个意图filter,你就可以创build你自己的scheme了。 ( 更多关于意图filter和意向的解决方法 。)

这是一个简短的例子:

 <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> 

根据隐式意图的工作方式,您至less需要定义一个动作和一个类别; 在这里,我select了VIEW作为动作(尽pipe它可以是任何东西),并确保添加DEFAULT类别(因为这是所有隐式意图所必需的)。 另外请注意我是如何添加类别BROWSABLE的 – 这不是必须的,但它会允许你的URI从浏览器(一个漂亮的function)是可以打开的。

作为@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"); } 

我强烈build议你不要定义你自己的scheme。 这违背了URIscheme的networking标准,为了避免不同实体之间的名称冲突,URIscheme尝试严格控制这些名称。 一旦你在一个网站上把你的scheme链接起来,你就把整个互联网名字空间中的那个小名字放在整个互联网的名字空间中,并且应该遵循这些标准。

如果你只是想能够链接到你自己的应用程序,我build议你按照我在这里描述的方法:

如何注册一些URL名称空间(myapp://app.start/)来访问您的程序通过在Android操作系统的浏览器中调用URL?

迭戈的另一种方法是使用图书馆:

https://github.com/airbnb/DeepLinkDispatch

您可以轻松地声明您想要处理的URI,以及您想通过活动中的注释提取的参数,如:

 @DeepLink("path/to/what/i/want") public class SomeActivity extends Activity { ... } 

另外,查询参数也将被传递给Activity。