天天看點

從URI看Mobile和Web資料

引言

在Mobile Analytics一文中,我們談到了Mobile APP和 Web APP資料最大的差別是在資料的開放度的問題,那我們就從uri和urL說起。

1、URI和URL

URI:Uniform Resource Identifier,統一資源辨別符,用來标記一個唯一的資源,URL:Uniform Resource Locator,統一資源定位符,是一種具體的uri的實作。

URI抽象結構 [scheme:]scheme-specific-part[#fragment]

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

authority為[user-info@]host[:port]

可以看出URI一般由三部分組成:通路資源的命名機制(scheme),存放資源的授權,包括使用者資訊和主機資訊(authority),資源自身的名稱,由路徑表示(path)。除外,還有query和fragment

2、WEB 的開放世界和 HTTP協定

HTTP協定,超文本傳輸協定,是WEB URL的一種,WWW世界裡面的核心協定。具體可以看這篇文章HTTP協定詳解 說web資料非常開放,就從http協定說起。在web的世界裡面,每一個人都可以通過一個類似于這樣的http協定的URL釋出和分享出去自己的内容 http://127.0.0.1:8080/cmd_helloworld/?name=xianyadan

其它人通過一個浏覽器就都可以查詢到,夠開放了吧

3、Android Activity與URI

相比之下,Android的世界就要封閉得多了,每一個應用都是一個獨立的小島,每一個小島裡面有很多Activity,但是很可能都不是對外的,意味這沒有辦法查詢到,即使是在同一個機器裝置上面。所有沒有辦法看到。 Android引入了自定義URI進入這封閉世界,帶來了一束光。具體可以看這篇文章Android 自定義URI SCHEME 通過這篇文章,我們可以看到在Android的裝置上面,我們也是有可能可以将自己的資訊分享給其它應用的,那就是通過自定義URI SCHEME,

<a href="xl://goods:8888/goodsDetail?goodsId=10011002" target="_blank" rel="external nofollow" >打開商品詳情</a>           
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
startActivity(intent);           

這樣其它應用就可以通路到了

4、Android Content Provider 與URI

ContentProvider在android中的作用是對外共享資料, 也就是說你可以通過ContentProvider把應用中的資料共享給其他應用通路,其他應用可以通過ContentProvider對你應用中的資料進行添删改查。關于資料共享,以前我們學習過檔案操作模式,知道通過指定檔案的操作模式為Context.MODE_WORLD_READABLE或 Context.MODE_WORLD_WRITEABLE同樣也可以對外共享資料。那麼,這裡為何要使用ContentProvider對外共享資料呢?是這樣的,如果采用檔案操作模式對外共享資料,資料的通路方式會因資料存儲的方式而不同,導緻資料的通路方式無法統一,如:采用xml檔案對外共享數 據,需要進行xml解析才能讀取資料;采用sharedpreferences共享資料,需要使用sharedpreferences API讀取資料。

使用ContentProvider對外共享資料的好處是統一了資料的通路方式,

ContentProvider的URI由以下三部分組成: "content://"、資料的路徑、标示ID(可選),舉些例子,如: 

  所有聯系人的Uri: content://contacts/people

  某個聯系人的Uri: content://contacts/people/5

  所有圖檔Uri: content://media/external

  某個圖檔的Uri:content://media/external/images/media/4

具體可以看看Android ContentProvider和Uri詳解

5、結語

我們在Mobile Analytics一文中分析了Mobile APP和Web APP最大的差別是對外的資料的呈現和分享的問題,今天就從URI的層面來看這個差別,毫無疑問,WWW是最開放的,通過http協定把内容放到網絡上開啟了人類的共享時代。 移動應用(C/S應用)本來是非常不開放的一個資源,在Android時代,通過Android的設計者們引入了URI到Activity,和引入URI到ContentProvider。就像在封閉的房間裡開了幾扇窗戶,在封閉的島上開放了一些渡口。但是很遺憾這種開放也僅僅局限于Android系統,目前還不能很好的分享到跨端。甚至在Android内部也沒有應用得那麼廣。

URI是分布式世界的一個核心,通過URI得内容裡面分享出URI是一個非常重要得連結世界得方式。一個開放的系統就是有更多得URI分享到外部世界。要學會做一個更加開放的系統。