成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

谷歌安卓開發(fā)指南

移動(dòng)開發(fā) Android
安卓是一種以Linux為基礎(chǔ)的開放源碼操作系統(tǒng),主要使用于便攜設(shè)備。目前尚未有統(tǒng)一中文名稱,中國(guó)大陸地區(qū)較多人使用“安卓”。安卓被谷歌收購(gòu)之后,發(fā)展迅速,谷歌安卓開發(fā)已經(jīng)成為手機(jī)開發(fā)中最重要的一個(gè)平臺(tái)。

安卓操作系統(tǒng)最初由Andy Rubin開發(fā),最初主要支持手機(jī)。2005年由Google收購(gòu)注資,并組建開放手機(jī)聯(lián)盟開發(fā)改良,逐漸擴(kuò)展到平板電腦及其他領(lǐng)域上。安卓的主要競(jìng)爭(zhēng)對(duì)手是蘋果公司的iOS以及RIM的Blackberry OS。2011年第一季度,安卓在全球的市場(chǎng)份額首次超過塞班系統(tǒng),躍居全球第一。 2012年2月數(shù)據(jù),安卓占據(jù)全球智能手機(jī)操作系統(tǒng)市場(chǎng)52.5%的份額,中國(guó)市場(chǎng)占有率為68.4%。

安卓用甜點(diǎn)作為它們系統(tǒng)版本的代號(hào)的命名方法開始于 安卓 1.5 發(fā)布的時(shí)候。作為每個(gè)版本代表的甜點(diǎn)的尺寸越變?cè)酱螅缓蟀凑?6個(gè)字母數(shù)序:紙杯蛋糕,甜甜圈,松餅,凍酸奶,姜餅,蜂巢,冰激凌三明治,根據(jù)最新消息新一代安卓版本將命名為果凍豆(Jelly Bean)。

架構(gòu)

谷歌安卓的系統(tǒng)架構(gòu)和其它操作系統(tǒng)一樣,采用了分層的架構(gòu)。從架構(gòu)圖看,谷歌安卓分為四個(gè)層,從高層到低層分別是應(yīng)用程序?qū)印?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層和linux核心層。

谷歌安卓是以Linux為核心的手機(jī)操作平臺(tái),作為一款開放式的操作系統(tǒng),隨著谷歌安卓的快速發(fā)展,如今已允許開發(fā)者使用多種編程語言來開發(fā)谷歌安卓應(yīng)用程序,而不再是以前只能使用Java開發(fā)谷歌安卓應(yīng)用程序的單一局面,因而受到眾多開發(fā)者的歡迎,成為真正意義上的開放式操作系統(tǒng)。

在谷歌安卓中,開發(fā)者可以使用Java作為編程語言來開發(fā)應(yīng)用程序,也可以通過NDK使用C/C++作為編程語言來開發(fā)應(yīng)用程序,也可使用SL4A來使用其他各種腳本語言進(jìn)行編程(如:python、lua、tcl、php等等),還有其他諸如:Qt(qt for 谷歌安卓)、Mono(mono for 谷歌安卓)等一些著名編程框架也開始支持谷歌安卓編程,甚至通過MonoDroid,開發(fā)者還可以使用C#作為編程語言來開發(fā)應(yīng)用程序。另外,谷歌還在2009年特別發(fā)布了針對(duì)初學(xué)者的谷歌安卓 Simple語言,該語言類似Basic語言。而在網(wǎng)頁編程語言方面,JavaScript,ajax,HTML5,jquery、sencha、dojo、mobl、PhoneGap等等都已經(jīng)支持谷歌安卓開發(fā)。

而在谷歌安卓系統(tǒng)底層方面,谷歌安卓使用C/C++作為開發(fā)語言。

應(yīng)用程序(部分)

早期的谷歌安卓應(yīng)用程序開發(fā),通常通過谷歌安卓 SDK(谷歌安卓軟件開發(fā)包)下使用Java作為編程語言來開發(fā)應(yīng)用程序,但通過不同的軟件開發(fā)包,則使用的編程語言也不同。

例如開發(fā)者可以通過谷歌安卓 NDK(谷歌安卓 Native開發(fā)包)使用C語言或者C++語言來作為編程語言開發(fā)應(yīng)用程序。同時(shí)谷歌還推出了適合初學(xué)者編程使用的Simple語言,該語言類似微軟公司的Visual Basic語言。此外,谷歌公司還推出了Google App Inventor開發(fā)工具,該開發(fā)工具可以快速地構(gòu)建應(yīng)用程序,方便新手開發(fā)者。

Java開發(fā)方面

谷歌安卓支持使用Java作為編程語言來開發(fā)應(yīng)用程序,而谷歌安卓的Java開發(fā)方面從接口到功能,都有層出不窮的變化。考慮到Java虛擬機(jī)的效率和資源占用,谷歌重新設(shè)計(jì)了谷歌安卓的Java,以便能提高效率和減少資源占用,因而與J2ME等不同。 谷歌安卓結(jié)構(gòu)其中Activity等同于J2ME的MIDlet,一個(gè) Activity 類(Class)負(fù)責(zé)創(chuàng)建視窗(Windows),一個(gè)活動(dòng)中的Activity就是在 foreground(前景)模式,背景運(yùn)行的程序叫做Service。兩者之間通過由ServiceConnection和AIDL連結(jié),達(dá)到復(fù)數(shù)程序同時(shí)運(yùn)行效果。如果運(yùn)行中的 Activity 全部畫面被其他 Activity 取代時(shí),該 Activity 便被停止(Stopped),甚至被系統(tǒng)清除(Kill)。

View等同于J2ME的Displayable,程序人員可以通過 View 類與“XML layout”檔將UI放置在視窗上,谷歌安卓 1.5的版本可以利用 View 打造出所謂的 Widgets,其實(shí)Widget只是View的一種,所以可以使用xml來設(shè)計(jì)layout,HTC的谷歌安卓 Hero手機(jī)即含有大量的widget。至于ViewGroup 是各種layout 的基礎(chǔ)抽象類(abstract class),ViewGroup之內(nèi)還可以有ViewGroup。View的構(gòu)造函數(shù)不需要再Activity中調(diào)用,但是Displayable的是必須的,在Activity 中,要通過findViewById()來從XML 中取得View,谷歌安卓的View類的顯示很大程度上是從XML中讀取的。View 與事件(event)息息相關(guān),兩者之間通過Listener 結(jié)合在一起,每一個(gè)View都可以注冊(cè)一個(gè)event listener,例如:當(dāng)View要處理用戶觸碰(touch)的事件時(shí),就要向谷歌安卓框架注冊(cè)View.OnClickListener。另外還有BitMap等同于J2ME的Image。

C/C++開發(fā)方面

早期的谷歌安卓開發(fā)只支持Java作為編程語言開發(fā)應(yīng)用程序,因而使得其他語言開發(fā)者只能望而卻步。2010年4月,谷歌正式對(duì)開發(fā)者發(fā)布了谷歌安卓 NDK,NDK允許開發(fā)者使用C/C++作為編程語言來為谷歌安卓開發(fā)應(yīng)用程序,初版的NDK使得開發(fā)者看到了C/C++在谷歌安卓開發(fā)中的希望。

但是,當(dāng)前版本的NDK在功能上還有很多局限性:NDK并沒有提供對(duì)應(yīng)用程序生命周期的維護(hù);NDK也不提供對(duì)谷歌安卓系統(tǒng)中大量系統(tǒng)事件的支持;對(duì)于作為應(yīng)用程序交互接口的UI API,當(dāng)前版本的NDK中也沒有提供。但是相對(duì)于初版的NDK,現(xiàn)在的NDK已經(jīng)進(jìn)行了許多重大的功能改進(jìn)。

由此可見,NDK仍然需要完善和發(fā)展,相信未來隨著NDK的發(fā)展,NDK可以做得更多更好。

中介軟件

操作系統(tǒng)與應(yīng)用程序的溝通橋梁,應(yīng)用分為兩層:函數(shù)層(Library)和虛擬機(jī)(Virtual Machine)。 Bionic是 谷歌安卓 改良libc的版本。谷歌安卓 同時(shí)包含了Webkit,所謂的Webkit 就是Apple Safari 瀏覽器背后的引擎。Surface flinger 是就2D或3D的內(nèi)容顯示到屏幕上。谷歌安卓使用工具鏈(Toolchain)為Google自制的Bionic Libc。

谷歌安卓采用OpenCORE作為基礎(chǔ)多媒體框架。OpenCORE可分7大塊:PVPlayer、PVAuthor、Codec、PacketVideo Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。

谷歌安卓 使用skia 為核心圖形引擎,搭配OpenGL/ES。skia與Linux Cairo功能相當(dāng),但相較于Linux Cairo, skia 功能還只是雛形的。2005年Skia公司被Google收購(gòu),2007年初,Skia GL源碼被公開,目前Skia 也是Google Chrome 的圖形引擎。

谷歌安卓的多媒體數(shù)據(jù)庫(kù)采用SQLite數(shù)據(jù)庫(kù)系統(tǒng)。數(shù)據(jù)庫(kù)又分為共用數(shù)據(jù)庫(kù)及私用數(shù)據(jù)庫(kù)。用戶可通過ContentResolver類(Column)取得共用數(shù)據(jù)庫(kù)。

谷歌安卓的中間層多以Java 實(shí)現(xiàn),并且采用特殊的Dalvik 虛擬機(jī)(Dalvik Virtual Machine)。Dalvik虛擬機(jī)是一種“暫存器型態(tài)”(Register Based)的Java虛擬機(jī),變量皆存放于暫存器中,虛擬機(jī)的指令相對(duì)減少。

Dalvik虛擬機(jī)可以有多個(gè)實(shí)例(instance), 每個(gè)谷歌安卓應(yīng)用程序都用一個(gè)自屬的Dalvik虛擬機(jī)來運(yùn)行,讓系統(tǒng)在運(yùn)行程序時(shí)可達(dá)到優(yōu)化。Dalvik 虛擬機(jī)并非運(yùn)行Java字節(jié)碼(Bytecode),而是運(yùn)行一種稱為.dex格式的文件。

硬件抽像層

谷歌安卓 的 HAL(硬件抽像層)是能以封閉源碼形式提供硬件驅(qū)動(dòng)模塊。HAL 的目的是為了把 谷歌安卓 framework 與 Linux kernel 隔開,讓 谷歌安卓 不至過度依賴 Linux kernel,以達(dá)成 kernel independent 的概念,也讓 谷歌安卓 framework 的開發(fā)能在不考量驅(qū)動(dòng)程序?qū)崿F(xiàn)的前提下進(jìn)行發(fā)展。

HAL stub 是一種代理人(proxy)的概念,stub 是以 *.so 檔的形式存在。Stub 向 HAL“提供”操作函數(shù)(operations),并由 谷歌安卓 runtime 向 HAL 取得 stub 的 operations,再 callback 這些操作函數(shù)。HAL 里包含了許多的 stub(代理人)。Runtime 只要說明“類型”,即 module ID,就可以取得操作函數(shù)。

內(nèi)核

谷歌安卓 是運(yùn)行于 Linux kernel之上,但并不是GNU/Linux。因?yàn)樵谝话鉍NU/Linux 里支持的功能,谷歌安卓 大都沒有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。谷歌安卓又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。谷歌安卓 為了達(dá)到商業(yè)應(yīng)用,必須移除被GNU GPL授權(quán)證所約束的部份,例如谷歌安卓將驅(qū)動(dòng)程序移到 userspace,使得Linux driver 與 Linux kernel徹底分開。bionic/libc/kernel/ 并非標(biāo)準(zhǔn)的kernel header files。谷歌安卓 的 kernel header 是利用工具由 Linux kernel header 所產(chǎn)生的,這樣做是為了保留常數(shù)、數(shù)據(jù)結(jié)構(gòu)與宏。

目前谷歌安卓 的 Linux kernel控制包括安全(Security),存儲(chǔ)器管理(Memory Management),程序管理(Process Management),網(wǎng)絡(luò)堆棧(Network Stack),驅(qū)動(dòng)程序模型(Driver Model)等。下載谷歌安卓源碼之前,先要安裝其構(gòu)建工具 Repo來初始化源碼。Repo 是 谷歌安卓 用來輔助Git工作的一個(gè)工具。

安全權(quán)限機(jī)制

谷歌安卓本身是一個(gè)權(quán)限分立的操作系統(tǒng)。在這類操作系統(tǒng)中,每個(gè)應(yīng)用都以唯一的一個(gè)系統(tǒng)識(shí)別身份運(yùn)行(Linux用戶ID與群組ID)。系統(tǒng)的各部分也分別使用各自獨(dú)立的識(shí)別方式。Linux就是這樣將應(yīng)用與應(yīng)用,應(yīng)用與系統(tǒng)隔離開。

系統(tǒng)更多的安全功能通過權(quán)限機(jī)制提供。權(quán)限可以限制某個(gè)特定進(jìn)程的特定操作,也可以限制每個(gè)URI權(quán)限對(duì)特定數(shù)據(jù)段的訪問。

谷歌安卓安全架構(gòu)的核心設(shè)計(jì)思想是,在默認(rèn)設(shè)置下,所有應(yīng)用都沒有權(quán)限對(duì)其他應(yīng)用、系統(tǒng)或用戶進(jìn)行較大影響的操作。這其中包括讀寫用戶隱私數(shù)據(jù)(聯(lián)系人或電子郵件),讀寫其他應(yīng)用文件,訪問網(wǎng)絡(luò)或阻止設(shè)備待機(jī)等。

安裝應(yīng)用時(shí),在檢查程序簽名提及的權(quán)限,且經(jīng)過用戶確認(rèn)后,軟件包安裝器會(huì)給予應(yīng)用權(quán)限。從用戶角度看,一款谷歌安卓應(yīng)用通常會(huì)要求如下的權(quán)限:

撥打電話、發(fā)送短信或彩信、修改/刪除SD卡上的內(nèi)容、讀取聯(lián)系人的信息、讀取日程信的息,寫入日程數(shù)據(jù)、讀取電話狀態(tài)或識(shí)別碼、精確的(基于GPS)地理位置、模糊的(基于網(wǎng)絡(luò)獲取)地理位置、創(chuàng)建藍(lán)牙連接、對(duì)互聯(lián)網(wǎng)的完全訪問、查看網(wǎng)絡(luò)狀態(tài),查看WiFi狀態(tài)、避免手機(jī)待機(jī)、修改系統(tǒng)全局設(shè)置、讀取同步設(shè)定、開機(jī)自啟動(dòng)、重啟其他應(yīng)用、終止運(yùn)行中的應(yīng)用、設(shè)定偏好應(yīng)用、震動(dòng)控制、拍攝圖片等。

一款應(yīng)用應(yīng)該根據(jù)自身提供的功能,要求合理的權(quán)限。用戶也可以分析一款應(yīng)用所需權(quán)限,從而簡(jiǎn)單判定這款應(yīng)用是否安全。如一款應(yīng)用是不帶廣告的單機(jī)版,也沒有任何附加的內(nèi)容需要下載,那么它要求訪問網(wǎng)絡(luò)的權(quán)限就比較可疑。#p#

組件

技術(shù)內(nèi)容:本系統(tǒng)主要由四個(gè)部分組成,即谷歌安卓四大組件,分別是:活動(dòng)(Activity): 用于表現(xiàn)功能。服務(wù)(Service): 相當(dāng)于后臺(tái)運(yùn)行的Activity。廣播接收器(BroadcastReceiver):用于接收廣播。內(nèi)容提供商(Content Provider): 支持在多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù)。

1 Activity

谷歌安卓 中,Activity 是所有程序的根本,所有程序的流程都運(yùn)行在Activity 之中,Activity可以算是開發(fā)者遇到的最頻繁,也是谷歌安卓 當(dāng)中最基本的模塊之一。在谷歌安卓的程序當(dāng)中,Activity 一般代表手機(jī)屏幕的一屏。如果把手機(jī)比作一個(gè)瀏覽器,那么Acitivity就相當(dāng)于一個(gè)網(wǎng)頁。在Activity 當(dāng)中可以添加一些Button、Check box 等控件。可以看到Activity 概念和網(wǎng)頁的概念相當(dāng)類似。

一般一個(gè)谷歌安卓 應(yīng)用是由多個(gè)Activity 組成的。這多個(gè)Activity 之間可以進(jìn)行相互跳轉(zhuǎn),例如,按下一個(gè)Button 按鈕后,可能會(huì)跳轉(zhuǎn)到其他的Activity。和網(wǎng)頁跳轉(zhuǎn)稍微有些不一樣的是,Activity 之間的跳轉(zhuǎn)有可能返回值,例如,從Activity A 跳轉(zhuǎn)到Activity B,那么當(dāng)Activity B 運(yùn)行結(jié)束的時(shí)候,有可能會(huì)給Activity A 一個(gè)返回值。這樣做在很多時(shí)候是相當(dāng)方便的。

當(dāng)打開一個(gè)新的屏幕時(shí),之前一個(gè)屏幕會(huì)被置為暫停狀態(tài),并且壓入歷史堆棧中。用戶可以通過回退操作返回到以前打開過的屏幕。我們可以選擇性的移除一些沒有必要保留的屏幕,因?yàn)楣雀璋沧?nbsp;會(huì)把每個(gè)應(yīng)用的開始到當(dāng)前的每一個(gè)屏幕保存在堆棧中。Activity 是由谷歌安卓 系統(tǒng)進(jìn)行維護(hù)的,它也有自己的生命周期,即它的一個(gè)產(chǎn)生、運(yùn)行、銷毀的一個(gè)周期,對(duì)于Activity,關(guān)鍵是其生命周期的把握,其次就是狀態(tài)的保存和恢復(fù)(onSaveInstanceState onRestoreInstanceState),以及Activity 之間的跳轉(zhuǎn)和數(shù)據(jù)傳輸(intent)。

2 Service

Service 是谷歌安卓 系統(tǒng)中的一種組件,它跟Activity 的級(jí)別差不多,但是他不能自己運(yùn)行,只能后臺(tái)運(yùn)行,并且可以和其他組件進(jìn)行交互。Service 是沒有界面的長(zhǎng)生命周期的代碼。Service 是一種程序,它可以運(yùn)行很長(zhǎng)時(shí)間,但是它卻沒有用戶界面。這么說有點(diǎn)枯燥,我們來看個(gè)例子。打開一個(gè)音樂播放器的程序,這個(gè)時(shí)候若想上網(wǎng)了,那么,我們打開谷歌安卓 瀏覽器,這個(gè)時(shí)候雖然我們已經(jīng)進(jìn)入了瀏覽器這個(gè)程序,但是,歌曲播放并沒有停止,而是在后臺(tái)繼續(xù)一首接著一首的播放。其實(shí)這個(gè)播放就是由播放音樂的Service進(jìn)行控制。當(dāng)然這個(gè)播放音樂的Service也可以停止,例如,當(dāng)播放列表里邊的歌曲都結(jié)束,或者用戶按下了停止音樂播放的快捷鍵等。service 可以在和多場(chǎng)合的應(yīng)用中使用,比如播放多媒體的時(shí)候用戶啟動(dòng)了其他Activity這個(gè)時(shí)候程序要在后臺(tái)繼續(xù)播放,比如檢測(cè)SD 卡上文件的變化,再或者在后臺(tái)記錄你地理信息位置的改變等等,總之服務(wù)嘛,總是藏在后頭的。開啟service有兩種方式:

(1) Context.startService():Service會(huì)經(jīng)歷onCreate -> onStart(如果Service還沒有運(yùn)行,則谷歌安卓先調(diào)用onCreate()然后調(diào)用onStart();如果Service已經(jīng)運(yùn)行,則只調(diào)用onStart(),所以一個(gè)Service的onStart方法可能會(huì)重復(fù)調(diào)用多次 );stopService的時(shí)候直接onDestroy,如果是調(diào)用者自己直接退出而沒有調(diào)用stopService的話,Service會(huì)一直在后臺(tái)運(yùn)行。該Service的調(diào)用者再啟動(dòng)起來后可以通過stopService關(guān)閉Service。 注意,多次調(diào)用Context.startservice()不會(huì)嵌套(即使會(huì)有相應(yīng)的onStart()方法被調(diào)用),所以無論同一個(gè)服務(wù)被啟動(dòng)了多少次,一旦調(diào)用Context.stopService()或者stopSelf(),他都會(huì)被停止。補(bǔ)充說明:傳遞給startService()的Intent對(duì)象會(huì)傳遞給onStart()方法。調(diào)用順序?yàn)椋簅nCreate --> onStart(可多次調(diào)用) --> onDestroy。

(2) Context.bindService():Service會(huì)經(jīng)歷onCreate() -> onBind(),onBind將返回給客戶端一個(gè)IBind接口實(shí)例,IBind允許客戶端回調(diào)服務(wù)的方法,比如得到Service運(yùn)行的狀態(tài)或其他操作。這個(gè)時(shí)候把調(diào)用者(Context,例如Activity)會(huì)和Service綁定在一起,Context退出了,Srevice就會(huì)調(diào)用onUnbind -> onDestroyed相應(yīng)退出,所謂綁定在一起就共存亡了 。

3 BroadcastReceiver

在谷歌安卓 中,Broadcast 是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。而BroadcastReceiver 是對(duì)發(fā)送出來的Broadcast進(jìn)行過濾接受并響應(yīng)的一類組件。可以使用BroadcastReceiver 來讓應(yīng)用對(duì)一個(gè)外部的事件做出響應(yīng)。這是非常有意思的,例如,當(dāng)電話呼入這個(gè)外部事件到來的時(shí)候,可以利用BroadcastReceiver 進(jìn)行處理。例如,當(dāng)下載一個(gè)程序成功完成的時(shí)候,仍然可以利用BroadcastReceiver 進(jìn)行處理。BroadcastReceiver不能生成UI,也就是說對(duì)于用戶來說不是透明的,用戶是看不到的。BroadcastReceiver通過NotificationManager 來通知用戶這些事情發(fā)生了。BroadcastReceiver 既可以在谷歌安卓Manifest.xml 中注冊(cè),也可以在運(yùn)行時(shí)的代碼中使用Context.registerReceiver()進(jìn)行注冊(cè)。只要是注冊(cè)了,當(dāng)事件來臨的時(shí)候,即使程序沒有啟動(dòng),系統(tǒng)也在需要的時(shí)候啟動(dòng)程序。各種應(yīng)用還可以通過使用Context.sendBroadcast () 將它們自己的intent broadcasts廣播給其他應(yīng)用程序。注冊(cè)BroadcastReceiver有兩種方式:

(1)在谷歌安卓Manifest.xml進(jìn)行注冊(cè)

 

 

這種方法有一個(gè)特點(diǎn)即使你的應(yīng)用程序已經(jīng)關(guān)閉了,但這個(gè)BroadcastReceiver依然會(huì)接受廣播出來的對(duì)象,也就是說無論你這個(gè)應(yīng)用程序時(shí)開還是關(guān)都屬于活動(dòng)狀態(tài)都可以接受到廣播的事件

(2)在代碼中注冊(cè)廣播

//實(shí)例化廣播接收器對(duì)象

BroadcastReceiver bcr = new BroadcastReceiver(){

public void onReceive(Context context, Intent intent) {

Log.d("test", "^-^, Have received Massage!");

}

};

IntentFilter filter=new IntentFilter();

filter.addAction(“XXX”);

this.registerReceiver(bcr, filter);

第一種俗稱靜態(tài)注冊(cè),第二種俗稱動(dòng)態(tài)注冊(cè),這兩種注冊(cè)BroadcastReceiver的區(qū)別:

動(dòng)態(tài)注冊(cè)較靜態(tài)注冊(cè)靈活。實(shí)驗(yàn)證明:當(dāng)靜態(tài)注冊(cè)一個(gè)BroadcastReceiver時(shí),不論應(yīng)用程序是啟動(dòng)與否。都可以接受對(duì)應(yīng)的廣播。

動(dòng)態(tài)注冊(cè)的時(shí)候,如果不執(zhí)行unregisterReceiver();方法取消注冊(cè),跟靜態(tài)是一樣的。但是如果執(zhí)行該方法,當(dāng)執(zhí)行過以后,就不能接受廣播了。

4 Content Provider

Content Provider,聽著就和數(shù)據(jù)相關(guān),沒錯(cuò),這就是谷歌安卓提供的第三方應(yīng)用數(shù)據(jù)的訪問方案。在谷歌安卓中,對(duì)數(shù)據(jù)的保護(hù)是很嚴(yán)密的,除了放在SD卡中的數(shù)據(jù),一個(gè)應(yīng)用所持有的數(shù)據(jù)庫(kù)、文件、等等內(nèi)容,都是不允許其他直接訪問的,但有時(shí)候,溝通是必要的,不僅對(duì)第三方很重要,對(duì)應(yīng)用自己也很重要。

Andorid當(dāng)然不會(huì)真的把每個(gè)應(yīng)用都做成一座孤島,它為所有應(yīng)用都準(zhǔn)備了一扇窗,這就是Content Provider。應(yīng)用想對(duì)外提供的數(shù)據(jù),可以通過派生ContentProvider類, 封裝成一枚Content Provider,每個(gè)Content Provider都用一個(gè)uri作為獨(dú)立的標(biāo)識(shí),形如:content://com.xxxxx。所有東西看著像REST的樣子,但實(shí)際上,它比REST 更為靈活。和REST類似,uri也可以有兩種類型,一種是帶id的,另一種是列表的,但實(shí)現(xiàn)者不需要按照這個(gè)模式來做,給你id的uri你也可以返回列表類型的數(shù)據(jù),只要調(diào)用者明白,就無妨,不用苛求所謂的REST。

另外,Content Provider不和REST一樣只有uri可用,還可以接受Projection,Selection,OrderBy等參數(shù),這樣,就可以像數(shù)據(jù)庫(kù)那樣進(jìn)行投影,選擇和排序。查詢到的結(jié)果,以Cursor(參見:reference/android/database/Cursor.html )的形式進(jìn)行返回,調(diào)用者可以移動(dòng)Cursor來訪問各列的數(shù)據(jù)。

Content Provider屏蔽了內(nèi)部數(shù)據(jù)的存儲(chǔ)細(xì)節(jié),向外提供了上述統(tǒng)一的接口模型,這樣的抽象層次,大大簡(jiǎn)化了上層應(yīng)用的書寫,也對(duì)數(shù)據(jù)的整合提供了更方便的途徑。Content Provider內(nèi)部,常用數(shù)據(jù)庫(kù)來實(shí)現(xiàn),谷歌安卓提供了強(qiáng)大的Sqlite支持,但很多時(shí)候,你也可以封裝文件或其他混合的數(shù)據(jù)。

在谷歌安卓中,ContentResolver是用來發(fā)起Content Provider的定位和訪問的。不過它僅提供了同步訪問的Content Provider的接口。但通常,Content Provider需要訪問的可能是數(shù)據(jù)庫(kù)等大數(shù)據(jù)源,效率上不足夠快,會(huì)導(dǎo)致調(diào)用線程的擁塞。因此谷歌安卓提供了一個(gè)AsyncQueryHandler(參見:reference/android/content/AsyncQueryHandler.html),幫助進(jìn)行異步訪問Content Provider。

在各大組件中,Service和Content Provider都是那種需要持續(xù)訪問的。Service如果是一個(gè)耗時(shí)的場(chǎng)景,往往會(huì)提供異步訪問的接口,而Content Provider不論效率如何,都提供的是約定的同步訪問接口。我想這遵循的就是場(chǎng)景導(dǎo)向設(shè)計(jì)的原則,因?yàn)镃ontent Provider僅是提供數(shù)據(jù)訪問的,它不能確信具體的使用場(chǎng)景如何,會(huì)怎樣使用它的數(shù)據(jù);而相比之下,Service包含的邏輯更復(fù)雜更完整,可以抉擇大部分時(shí)候使用某接口的場(chǎng)景,從而確定最貼切的接口是同步還是異步,簡(jiǎn)化了上層調(diào)用的邏輯。

責(zé)任編輯:佚名 來源: 互聯(lián)網(wǎng)整理
相關(guān)推薦

2011-07-25 16:21:22

Sencha touc

2022-08-02 08:01:09

開發(fā)插件Chrome前端技術(shù)

2011-09-22 14:39:17

API

2012-03-26 09:44:32

安卓開發(fā)配置Eclipse

2011-06-09 18:24:36

QT Wince

2023-05-15 18:44:07

前端開發(fā)

2009-06-24 16:30:21

JSF組件模型

2012-03-28 09:40:55

安卓開發(fā)入門教程視頻

2012-03-28 10:37:55

谷歌安卓開發(fā)工具AppInventor

2015-12-16 10:30:18

前端開發(fā)指南

2010-06-13 09:27:56

Widget開發(fā)

2015-11-12 16:14:52

Python開發(fā)實(shí)踐

2019-10-31 08:00:00

機(jī)器學(xué)習(xí)人工智能AI

2021-08-09 09:47:34

Blazor 路由開發(fā)

2011-12-29 10:48:49

移動(dòng)Web

2011-04-18 11:00:34

使用音頻BlackBerry

2012-05-18 10:08:56

TitaniumAndroid

2021-06-21 15:21:52

鴻蒙HarmonyOS應(yīng)用開發(fā)

2011-08-02 17:58:09

iPhone開發(fā) 事件

2011-11-29 16:38:58

Knockout
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲人免费视频 | 午夜欧美| 男女爱爱网站 | 91视频在线看 | 第四色影音先锋 | 91精品久久久久久综合五月天 | 成人在线免费观看 | 国产9 9在线 | 中文 | 青青久草 | 黄色av网站在线观看 | 999精品视频 | 国产一区二区 | 日本三级电影在线观看视频 | a黄视频| 国产成人精品免费视频大全最热 | 欧美日韩在线精品 | 亚洲在线免费观看 | 国产精品69毛片高清亚洲 | 久久精品这里 | 日日日操 | 96国产精品久久久久aⅴ四区 | 国产久| www.操.com| 天天干免费视频 | 日韩伦理一区二区 | 亚洲综合网站 | 成人网在线看 | 天天看天天操 | 亚洲成人福利在线观看 | 九九久久国产精品 | 日日夜夜天天 | 天天草av| 草b视频| 日韩激情网 | 亚洲高清免费 | 日韩精品久久久 | 午夜影院黄 | 不卡在线一区 | 久久国产精品一区二区三区 | 中文字幕一二三区 | 狠狠夜夜|