Android中的Uri

作者: 陈利健 | 来源:发表于2015-08-27 11:34 被阅读2991次

    之前在做图像裁剪功能的时候涉及到了Uri,以及联想到ContentProvider中也使用到了Uri,对这块内容还不是非常熟悉,于是在这里做一个总结。


    java中的URI和Android中的Uri有什么区别?

    • 1.所属的包不同。URI位置在java.net.URI,显然是Java提供的一个类。而Uri位置在android.net.Uri,是由Android提供的一个类。所以初步可以判断,Uri是URI的“扩展”以适应Android系统的需要。
    • 2.作用的不同。URI类代表了一个URI(这个URI不是类,而是其本来的意义:通用资源标志符——Uniform Resource Identifier)实例。Uri类是一个不可改变的URI引用,包括一个URI和一些碎片,URI跟在“#”后面。建立并且转换URI引用。而且Uri类对无效的行为不敏感,对于无效的输入没有定义相应的行为,如果没有另外制定,它将返回垃圾而不是抛出一个异常。

    Uri的结构

    • [scheme:]scheme-specific-part[#fragment]
    • [scheme:][//authority][path][?query][#fragment]
    • [scheme:][//host:port][path][?query][#fragment]

    其中有下面几个规则

    举例分析

    http://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4#harvic
    
    • scheme:匹对上面的两个Uri标准形式,很容易看出在:前的部分是scheme,所以这个Uri字符串的sheme是:http
    • scheme-specific-part:很容易看出scheme-specific-part是包含在scheme和fragment之间的部分,也就是包括第二部分的[//authority][path][?query]这几个小部分,所在这个Uri字符串的scheme-specific-part是://www.java2s.com:8080/yourpath/fileName.htm?stove=10&path=32&id=4 ,注意要带上//,因为除了[scheme:]和[#fragment]部分全部都是scheme-specific-part,当然包括最前面的//;
    • fragment:这个是更容易看出的,因为在最后用#分隔的部分就是fragment,所以这个Uri的fragment是:harvic下面就是对scheme-specific-part进行拆分了;在scheme-specific-part中,最前端的部分就是authority,?后面的部分是query,中间的部分就是path
    • authority:很容易看出scheme-specific-part最新端的部分是:www.java2s.com:8080
    • query:在scheme-specific-part中,?后的部分为:stove=10&path=32&id=4
    • path:query:在scheme-specific-part中,除了authority和query其余都是path的部分:/yourpath/fileName.htm又由于authority又一步可以划分为host:port形式,其中host:port用冒号分隔,冒号前的是host,冒号后的是port,所以:
    • host:www.java2s.com
    • port:8080

    代码提取

    • getScheme() :获取Uri中的scheme字符串部分,在这里即,http
    • getSchemeSpecificPart():获取Uri中的scheme-specific-part:部分,这里是://www.java2s.com:8080/yourpath/fileName.htm?
    • getFragment():获取Uri中的Fragment部分,即harvic
    • getAuthority():获取Uri中Authority部分,即www.java2s.com:8080
    • getPath():获取Uri中path部分,即/yourpath/fileName.htm
    • getQuery():获取Uri中的query部分,即stove=10&path=32&id=4
    • getHost():获取Authority中的Host字符串,即www.java2s.com
    • getPost():获取Authority中的Port字符串,即8080

    绝对URI和相对URI

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

    对于Uri的使用,可以用来启动我们的应用,可以传值,也可以用于notification。
    推荐一篇文章,总结的很好。
    http://blog.csdn.net/harvic880925/article/details/44781557

    相关文章

      网友评论

        本文标题:Android中的Uri

        本文链接:https://www.haomeiwen.com/subject/nlphcttx.html