在从URI看Mobile和Web数据一文中,我们讲到了Android的设计者们在Activity 中引入了URI,即通过自定义URL Scheme来定位一个页面,外部和内部应用可以通过一个uri非常方便的定位到Android的各个页面,文章转载自Android业务组件化之URL Scheme使用,感谢总李写代码

1、什么是URL Scheme?

android中的scheme是一种页面内跳转协议,是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;通过scheme协议,服务器可以定制化告诉App跳转那个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面等。

2、URL Scheme应用场景

客户端应用可以向操作系统注册一个 URL scheme,该 scheme 用于从浏览器或其他应用中启动本应用。通过指定的 URL 字段,可以让应用在被调起后直接打开某些特定页面,比如商品详情页、活动详情页等等。也可以执行某些指定动作,如完成支付等。也可以在应用内通过 html 页来直接调用显示 app 内的某个页面。综上URL Scheme使用场景大致分以下几种:

  • 服务器下发跳转路径,客户端根据服务器下发跳转路径跳转相应的页面
  • H5页面点击锚点,根据锚点具体跳转路径APP端跳转具体的页面
  • APP端收到服务器端下发的PUSH通知栏消息,根据消息的点击跳转路径跳转相关页面
  • APP根据URL跳转到另外一个APP指定页面

3、URL Scheme协议格式

先来个完整的URL Scheme协议 xl://goods:8888/goodsDetail?goodsId=10011002

通过上面的路径 Scheme、Host、port、path、query全部包含,基本上平时使用路径就是这样子的。

  • xl代表该Scheme 协议名称
  • goods代表Scheme作用于哪个地址域
  • goodsDetail代表Scheme指定的页面
  • goodsId代表传递的参数
  • 8888代表该路径的端口号

4、URL Scheme如何使用?

1.)在AndroidManifest.xml中对标签增加设置Scheme

                                                                                                                                                    

2.)获取Scheme跳转的参数

Uri uri = getIntent().getData();if (uri != null) {    // 完整的url信息    String url = uri.toString();    Log.e(TAG, "url: " + uri);    // scheme部分    String scheme = uri.getScheme();    Log.e(TAG, "scheme: " + scheme);    // host部分    String host = uri.getHost();    Log.e(TAG, "host: " + host);    //port部分    int port = uri.getPort();    Log.e(TAG, "host: " + port);    // 访问路劲    String path = uri.getPath();    Log.e(TAG, "path: " + path);    List pathSegments = uri.getPathSegments();    // Query部分    String query = uri.getQuery();    Log.e(TAG, "query: " + query);    //获取指定参数值    String goodsId = uri.getQueryParameter("goodsId");    Log.e(TAG, "goodsId: " + goodsId);}

3.)调用方式

网页上

<a href="xl://goods:8888/goodsDetail?goodsId=10011002">打开商品详情a>
原生调用

  Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));  startActivity(intent);
4.)如何判断一个Scheme是否有效

PackageManager packageManager = getPackageManager();Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));List activities = packageManager.queryIntentActivities(intent, 0);boolean isValid = !activities.isEmpty();if (isValid) {    startActivity(intent);}

更多相关文章

  1. Android 原生页面同H5交互
  2. Android API开发之蓝牙开发之Android蓝牙开发GATT协议
  3. Android Studio中配置代码和资源的路径
  4. JS与Android交互之html页面跳转到Android Activity
  5. Intent实现Android间的页面跳转
  6. Android Studio apk生成路径
  7. android页面布局
  8. ViewPager实现一个页面多个Item的显示

随机推荐

  1. 理财扫盲之什么叫通货膨胀
  2. RPM打包,安装到指定目录
  3. Python 爬虫进阶必备 | 某工业超市加密 h
  4. 工具之_grep,sed,awk
  5. 手机端首页仿写
  6. Android 网络开发抓包工具Fiddler、tcpdu
  7. Docker_学习笔记系列之网络
  8. Docker_学习笔记系列之数据卷
  9. 【网站模板】第01期—15套免费网站后台管
  10. CI/CD笔记-Jenkins的安装部署