Uri结构解析(Android)

URI(uniform resource identifier):统一资源标识符
URL(uniform resource locator):统一资源定位符
URN(uniform resource name):统一资源命名

URI结构

接下来看一下URI的结构:

[scheme:][//authority][path][?query][#fragment]
[scheme:][//host:port][path][?query][#fragment]

path可以有多个,每个用/连接,比如:
scheme://authority/path1/path2/path3?query#fragment

query参数可以带有对应的值,也可以不带,如果带对应的值用=表示,如:
scheme://authority/path1/path2/path3?id = 1#fragment

query参数可以有多个,每个用&连接:
scheme://authority/path1/path2/path3?id=1&name=ming&old#fragment

接下来我们一个Android的实例:

//Manifest文件配置
<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:host="test"
		android:path="/page"
		android:port="8080"
		android:scheme="app" />
</intent-filter>

启动页面配置:

Uri uri = Uri.parse("app://test:8080/page?system=android&id=45464");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

接收页面配置:

Intent intent = getIntent();
String scheme = intent.getScheme();
String dataString = intent.getDataString();
Uri uri = intent.getData();

System.out.println("scheme=" + scheme);
System.out.println("dataString=" + dataString);

if (uri != null) {
	//完整的url信息
	String url = uri.toString();
	//scheme部分
	String schemes = uri.getScheme();
	//host部分
	String host = uri.getHost();
	//port部分
	int port = uri.getPort();
	//访问路径
	String path = uri.getPath();
	//编码路径
	String path1 = uri.getEncodedPath();
	//query部分
	String queryString = uri.getQuery();
	//获取参数值
	String system = uri.getQueryParameter("system");
	String id = uri.getQueryParameter("id");

	System.out.println("url=" + url);
	System.out.println("schemes=" + schemes);
	System.out.println("host=" + host);
	System.out.println("port=" + port);
	System.out.println("path=" + path);
	System.out.println("path1=" + path1);
	System.out.println("queryString=" + queryString);

	System.out.println("system=" + system);
	System.out.println("id=" + id);
}

最终看一下执行结果:

scheme=app
dataString=app://test:8080/page?system=android&id=45464
url=app://test:8080/page?system=android&id=45464
schemes=app
host=test
port=8080
path=/page
path1=/page
queryString=system=android&id=45464
system=android
id=45464

接下来有两个问题简明说一下:

1、使用自定义的URL启动Activity时,默认是以FLAG_ACTIVITY_NEW_TASK的方式启动的,所以可能存在URL启动的Activity跟应用已启动的Activity不再同一个堆栈的现象。

方案:这种情况下,需要在manifest中将Activity多配置一个taskAffinity属性,约束URL启动的Activity与应用自身的启动的Activity在同一个堆栈中。

2、应用A使用url的方式唤起应用B的Activity时,可能存在应用B的Activity启动了,但是堆栈仍然在后台的现象,即应用B的Activity没有聚焦的问题。

方案:这种情况下,应用B的Activity收到启动的请求后,可以主动将Activity对应的堆栈移动到最前端,需要在manifest中申请android.permission.REORDER_TASKS权限。

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
 
am.moveTaskToFront(getTaskId(), am.MOVE_TASK_WITH_HOME);  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪舞飞影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值