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

Uri结构解析(Android)_第1张图片

接下来看一下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=appdataString=app://test:8080/page?system=android&id=45464url=app://test:8080/page?system=android&id=45464schemes=apphost=testport=8080path=/pagepath1=/pagequeryString=system=android&id=45464system=androidid=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);  

更多相关文章

  1. 清除Android工程中没用到/未用到的资源
  2. android资源:菜单和assets
  3. Android利用资源名称获取其id之getIdentifier()方法
  4. asynchttpclient的post方法发送json格式参数和表单格式参数
  5. Camera.Parameters android相机参数
  6. [读书笔记]Android LayoutInflater.inflate方法参数详解原理分析
  7. Android开发相关工具等资源快速查找地址
  8. android获取CPU参数(命令行方式)

随机推荐

  1. 百度大规模战略性混部系统演进
  2. 新型冠状病毒来袭,非典期间的一段回忆
  3. 大数据独角兽 MapR 难以为继,将资产出售给
  4. MySQL8.0发布,你熟悉又陌生的Hash Join?
  5. 在计量实证中常见操作问题小结,计量经济圈
  6. 如果你在准备面试,好好看看这130道题
  7. 如何构建一个完整的To B应用开发平台
  8. 《世界前200名顶尖计量经济学家》,计量经
  9. 2020年要做的几件大事
  10. 六成开发者日编程不足4小时,半数认为学习