假如我想定义一个类似于以下 URI 的东西:
myapp://path/to/what/i/want?d=This%20is%20a%20test
必须由我的应用程序或服务处理。请注意,方案是"myapp"
而不是"http"
或"ftp"
。这正是我想要的:在Android操作系统中全局定义自己的URI模式。这可能吗?
这有点类似于一些程序已经在Windows系统上执行的操作,例如Skype (skype://
)或任何种子下载程序(torrent://
)。
假如我想定义一个类似于以下 URI 的东西:
myapp://path/to/what/i/want?d=This%20is%20a%20test
必须由我的应用程序或服务处理。请注意,方案是"myapp"
而不是"http"
或"ftp"
。这正是我想要的:在Android操作系统中全局定义自己的URI模式。这可能吗?
这有点类似于一些程序已经在Windows系统上执行的操作,例如Skype (skype://
)或任何种子下载程序(torrent://
)。
<data>
元素定义URI方案。您可以设置一个意图过滤器,填写<data>
元素,然后就能创建自己的方案了。(更多有关意图过滤器和意图解析的信息请参阅此处。)<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>
在补充@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");
}
http://www.host.com/directory/value
,我们该如何获取 value
值? - Bugs Happenuri.getLastPathSegment();
。 - Martin我强烈建议您不要定义自己的URI方案。这违反了URI方案的Web标准,这些标准试图严格控制这些名称,有充分的理由-以避免不同实体之间的名称冲突。一旦您在网站上放置一个指向您方案的链接,您就已经将那个小名称放入整个互联网的命名空间中,并应该遵循这些标准。
如果您只想要能够链接到自己的应用程序,我建议您按照我在这里描述的方法操作:
如何注册某个URL命名空间(myapp://app.start/),以通过在Android OS浏览器中调用URL来访问您的程序?
另一种实现Diego方案的替代方法是使用一个库:
https://github.com/airbnb/DeepLinkDispatch
您可以通过在Activity上的注释来轻松声明您想要处理的URI和提取的参数,例如:@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
...
}
urlpatterns
变量来定义URL模式并将其与视图函数或类绑定。例如:from django.urls import path from . import views app_name = 'myapp' urlpatterns = [ path('app/start/', views.start, name='start'), # additional URL patterns go here ]
在这里,我们定义了一个名为myapp
的应用程序命名空间,然后定义了一个名为start
的URL模式,并将其与名为views.start
的视图函数绑定。最后,我们指定了该URL模式的名称,以便在模板中引用它。在Django项目中使用应用程序命名空间时,请确保在include()
函数中包含命名空间参数。例如,如果您要在Django项目的主URLconf中包含myapp
应用程序的URL配置,则可以执行以下操作:from django.urls import include, path urlpatterns = [ path('myapp/', include('myapp.urls', namespace='myapp')), # additional URL patterns go here ]
在这里,我们将myapp
应用程序的URL配置包括在Django项目的主URLconf中,并指定命名空间为myapp
。由此产生的URL将具有形式/myapp/app/start/
,并且可以在模板中使用名称myapp:start
进行引用。 - Casebash