URL与URI

URL

一.概念:

1.统一资源定位符(Uniform Resource Locator),是互联网上标准资源的地址,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器对其的处理方式,互联网是URL的使用领域.

2.URL是URI的一个子集,URI属于更高层次的抽象,如水果(URI)和苹果(URL)的关系.
统一资源标志符URI确定一个资源,统一资源定位符URL不但确定一个资源,而且还表示出它在哪里.

3.完整的,带有授权部分的普通统一资源标志符语法结构:

协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

二.结构:

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

1.协议 : http即是协议中的一种,我们知道计算机网络体系结构通信协议划分为七层(应用层,表示层,会话层,传输层,网络层,数据链路层,物理层),这里指的协议是应用层协议,应用层协议有 : DHCP ·DNS · FTP · Gopher · HTTP· IMAP4 · IRC · NNTP · XMPP ·POP3 · SIP · SMTP ·SNMP · SSH ·TELNET · RPC · RTCP · RTP ·RTSP· SDP · SOAP · GTP · STUN · NTP· SSDP · BGP · RIP 等,其中最常用的就是http,https,ftp,file等,协议的作用就是计算机之间进行通信的规则.

2.域名 : 该URL的域名部分为"www.aspxfans.com",一个URL中,也可以使用IP地址作为域名使用,其中www属于host,host即是定义域主机(http 的默认主机是 www).

3.端口 : 8080即端口,端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口.

4.虚拟目录 : /news/即虚拟目录.

5.文件名 : index.asp即文件名,即我们真正想要访问的文件,非必须,若省略同样采用默认的文件名.

6.参数 : 从“?”开始到“#”为止之间的部分为参数部分,有多个参数用&分开,如boardID=5中boardID为key,5为value,即键值对,我们可以通过key来获取value,参数非必须.

7.锚 : 从“#”开始到最后,都是锚部分,非必须.

安卓中的Uri

一.内容提供器中的Uri:

1.我们都知道程序访问自身的数据库进行的是CRUD,接收的参数是表名,但是由于访问外部程序需要的是资源的实际具体位置,所以不能在接收表名参数,而是一个内容Uri.

2.内容URI主要由两部分组成,authority和path,内容URI的标准格式:
content://com.example.app.provider/table1
[content://为协议声明, com.example.app.provider为authority,这是对不同程序的区分,所以用包名, table1是path,用来区分表]

3.得到内容URI后还需解析成Uri对象:
Uri uri = Uri.parse("content://com.example.app.provider/table1");

4.之后利用ContentResolver类的query()方法即可跨程序操作数据库.
Cursor cursor = getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);

5.此外还可以这样写:

content://com.example.app.provider/table1/1

[表示调用方期望访问的是om.example.app.provider这个应用的table1表中id为1的数据]

content://com.example.app.provider/*

[表示匹配任表的内容]

content://com.example.app.provider/table1/#

[表示匹配table1表中的任一行数据]

二.URI与Uri

1.URI位置在java.net.URI,显然是Java提供的一个类,而Uri位置在android.net.Uri,是由Android提供的一个类,Uri是URI的“扩展”以适应Android系统的需要.

基础

一.结构:

1.基本形式: [scheme:]scheme-specific-part[#fragment]
2.进一步划分: [scheme:][//authority][path][?query][#fragment]
scheme-specific-part部分是[scheme:]与[#fragment]中的全部内容,即[//authority][path][?query]
3.最终划分: [scheme:][//host:port][path][?query][#fragment]
[//authority]可以分为[//host:port]的形势.

二.解析:

1.path可以有多个,每个用" / "连接
2.query参数可以带有对应的值,也可以不带,如果带对应的值用" = "表示,query参数可以有多个,每个用" & "连接
3.在android中,除了scheme、authority是必须要有的,其它的几个path、query、fragment,
它们每一个可以选择性的要或不要,但顺序不能变.

三.例子:

http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic
scheme:        http
authority:        www.java2s.com:8080
path:        /yourpath/fileName.htm  注意开头有"/"
query:        stove=10&path=32&id=4
fragment:        harvic
scheme-specific-part : //www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4
host:        www.java2s.com
port:        8080

四.获取:

1.Uri uri = Uri.parse("http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic");
利用Uri的pares方法解析一个Uri之后,便可以利用下面的方法获取相应的字符串了:
getScheme(),getSchemeSpecificPart(),getFragment(),getAuthority(),getPath(),getQuery(),getHost(),getPost()

2.此外还有getPathSegments(),getQueryParameter(String key)
我们知道path可以有多个,利用getPathSegments()方法就可以单独分开获取path,这个方法返回一个List<String>
相应的getQueryParameter(String key)方法是不是可以单独分开获取query呢?并不是,它需要传入一个Key,来获取相应的值,
比如uri.getQueryParameter("stove")获取到的就是10了.

五.绝对Uri和相对Uri

1.绝对Uri:以scheme组件起始的完整格式,如http://fsjohnhuang.cnblogs.com。表示以对标识出现的环境无依赖的方式引用资源。 
2.相对Uri:不以scheme组件起始的非完整格式,如fsjohnhuang.cnblogs.com。表示以对依赖标识出现的环境有依赖的方式引用资源。 

六.不透明URI和分层URI

1.不透明URI:scheme-specific-part组件不是以正斜杠(/)起始的,如mailto:fsjohnhuang@xxx.com。由于不透明URI无需进行分解操作,因此不会对scheme-specific-part组件进行有效性验证。 
2.分层URI:scheme-specific-part组件是以正斜杠(/)起始的,如http://fsjohnhuang.com。

进阶

一.配合Intent来隐式启动活动:

Uri uri = Uri.parse("qijian://test.uri.activity?action=1");
Intent intent = new Intent("android.qijian.schemeurl.activity");
intent.setData(uri);
startActivity(intent);
-------------------------------
<activity
    android:name=".SecondActivity"
    android:label="@string/title_activity_second">
    <intent-filter>
        <action android:name="android.qijian.schemeurl.activity" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
            android:scheme="qijian"
            android:host="test.uri.activity" />
    </intent-filter>
</activity>

二.通过Uri来传递参数,并处理:

Uri uri = Uri.parse("qijian://test.uri.activity?action=1");
Intent intent = new Intent("android.qijian.schemeurl.activity");    //启动android.qijian.schemeurl.activity活动
intent.setData(uri);
startActivity(intent);
-----------------------
在别的活动中接收:
Intent intent = getIntent();
if (null != intent) {
            Uri uri = intent.getData();    //获取上面活动intent.setData(uri);中的uri字符串
            if (uri == null) {
                return;
            }
            String acionData = uri.getQueryParameter("action");        //解析key为的action的值,即实现了获取上个活动的值了.
}

三.这个知识的典型例子就是点击Notification启动活动了.

四.有关path、pathPrefix、pathPattern 之间的区别:

<activity
    android:name=".SecondActivity"
    android:label="@string/title_activity_second">
    <intent-filter>
        <action android:name="android.qijian.schemeurl.activity" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
            android:scheme="qijian"
            android:host="test.uri.activity"
            android:path=""
            android:pathPrefix=""
            android:pathPattern=""/>
    </intent-filter>
</activity>
1.path: 用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
2.pathPrefix: 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
3.pathPattern: 用表达式来匹配整个路径,这里需要说下匹配符号与转义。

五.匹配符号与转义: 

1.匹配符号规则:

""用来匹配0次或更多,如:“a” 可以匹配“a”、“aa”、“aaa”… 
"."用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”… 
因此  ".*" 就是用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”… 

2.转义: 

因为当读取 Xml 的时候,“\” 是被当作转义字符的(当它被用作 pathPattern 转义之前),
因此这里需要两次转义,读取 Xml 是一次,在 pathPattern 中使用又是一次。
如:“” 这个字符就应该写成 “\”,“\” 这个字符就应该写成 “\\”。

3.样例:匹配 http 以 “.pdf” 结尾的路径

如果我们想要匹配 http 以 “.pdf” 结尾的路径,使得别的程序想要打开网络 pdf 时,用户能够可以选择我们的程序进行下载查看。
<intent-filter>
     <action android:name="android.intent.action.VIEW"></action>
     <category android:name="android.intent.category.DEFAULT"></category>
     <data android:scheme="http" android:pathPattern=".*\\.pdf"></data>
</intent-filter>
如果你只想处理某个站点的 pdf,那么在 data 标签里增加 android:host="yoursite.com" 则只会匹配 http://yoursite.com/xxx/xxx.pdf,
但这不会匹配 www.yoursite.com,
如果你也想匹配这个站点的话,你就需要再添加一个 data 标签,除了 android:host 改为 “www.yoursite.com” 其他都一样。
如果想要从网页中点击一个链接跳转到我们的应用,那除了Intent-filter中的各种匹配工作,还应该加上一个属性:
<category android:name="android.intent.category.BROWSABLE"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值