Android應用程序開發(fā)基礎 課件 第7、8章 內(nèi)容提供者、服務_第1頁
Android應用程序開發(fā)基礎 課件 第7、8章 內(nèi)容提供者、服務_第2頁
Android應用程序開發(fā)基礎 課件 第7、8章 內(nèi)容提供者、服務_第3頁
Android應用程序開發(fā)基礎 課件 第7、8章 內(nèi)容提供者、服務_第4頁
Android應用程序開發(fā)基礎 課件 第7、8章 內(nèi)容提供者、服務_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

第七章內(nèi)容提供者學習目標1理解跨應用數(shù)據(jù)共享的工作原理2掌握內(nèi)容提供者的創(chuàng)建和定義3能夠?qū)崿F(xiàn)不同應用程序之間的數(shù)據(jù)共享7.1內(nèi)容提供者概述在Android中,每一個應用程序的數(shù)據(jù)都是采用私有的形式進行操作的,不管這些數(shù)據(jù)是用文件還是數(shù)據(jù)庫保存,都不能被外部應用程序訪問。在很多情況下,用戶需要在不同應用程序之間進行數(shù)據(jù)的共享,為了解決這類問題,Android專門提供了Content

Provider以實現(xiàn)不同應用程序之間的數(shù)據(jù)共享。通常,會在以下兩種場景中使用內(nèi)容提供者:一是通過代碼訪問其他應用中的現(xiàn)有內(nèi)容提供者,二是在應用中創(chuàng)建新的內(nèi)容提供者,從而與其他應用共享數(shù)據(jù)。7.2訪問系統(tǒng)通訊錄

在Android中系統(tǒng)的許多應用都提供了內(nèi)容提供者,其它應用程序可以訪問其中的數(shù)據(jù)。下面我們通過一個實例來訪問系統(tǒng)的通訊錄。

分析:對于系統(tǒng)通訊錄的訪問,由于通訊錄屬于危險權(quán)限,在應用時需要動態(tài)申請權(quán)限,實現(xiàn)步驟如下所示。1動態(tài)申請權(quán)限這里動態(tài)申請權(quán)限使用了request

Permissions()方法,此方法的原型如下所示:

request

Permissions(

final

@

Non

Null

Activity

activity,

final

@

Non

NullString[]

permissions,

final

@

Int

Range(

from

=

0

)

int

request

Code)

方法有三個參數(shù),第一個參數(shù)為Activity,第二個參數(shù)為String[]表示需要申請的權(quán)限,如果有多個權(quán)限數(shù)組中添加數(shù)據(jù)元素就可以了。第三個參數(shù)為int類型,表示請求碼。2訪問系統(tǒng)通訊錄

對于每一個應用程序來說,如果想要訪問內(nèi)容提供者中共享的數(shù)據(jù),就一定要借助

Content

Resolver類。Content

Resolver可以與任意內(nèi)容提供者進行會話,與其合作來對所有相關(guān)交互通訊進行管理。當外部應用需要對Content

Provider中的數(shù)據(jù)進行添加、刪除、修改和查詢操作時,通過get

Content

Resolver()方法獲取到

Content

Resolver類的實例。Content

Resolver中提供了一系列的方法用于對數(shù)據(jù)進行增刪改查操作。在上面的代碼中主要有以下幾點:(1

)get

Content

Resolver()方法:獲取Content

Resolver類的實例;

(2

)query()方法:用來查詢數(shù)據(jù),它的用法與我們在SQLite中的用法一樣,它的第一個參數(shù)是要查詢的數(shù)據(jù)表;2訪問系統(tǒng)通訊錄(3

)Contacts

Contract.Common

Data

Kinds.Phone.CONTENT_URI:其中

Contacts

Contract.Common

Data

Kinds.Phone是系統(tǒng)封裝好的,

CONTENT_URI是一個常量,查看它的定義為:

public

static

final

Uri

CONTENT_URI

=

Uri.

with

Appended

Path(

Data.

CONTENT_URI,

"

phones");

可以看到CONTENT_URI就是Uri對象,我們在自定義內(nèi)容提供者時會提到設置Uri,在訪問共享數(shù)據(jù)時通過Uri來找,而這里直接使用系統(tǒng)定義好的。(4

)Contacts

Contract.Common

Data

Kinds.Phone.DISPLAY_NAME和Contacts

Contract.Common

Data

Kinds.Phone.NUMBER分別為系統(tǒng)通訊錄中的用戶名和號碼。7.3程序間數(shù)據(jù)共享

內(nèi)容提供者是Android的四大組件之一,它的創(chuàng)建與Activity的類似。下面我們演示如何創(chuàng)建內(nèi)容提供者,創(chuàng)建Content

Provider。圖7-4新建Content

Provide的對話框

Uri是統(tǒng)一資源定位符,在內(nèi)容提供者中Uri代表了要操作的數(shù)據(jù),每個內(nèi)容提供者中都會對外提供一個公共的Uri對象,當應用程序數(shù)據(jù)需要共享時,其它的應用程

序就可以通過Content

Provider傳入這個Uri來對數(shù)據(jù)進行操作。Uri的格式如下所示:content://authority//path有三個部分組成。第一部分:“content://”是系統(tǒng)規(guī)定的固定寫法;

第二部分:authority是一個標志,是內(nèi)容提供者的字符串,也就是該內(nèi)容提供者的標識符,相當于我們每個人都有的姓名;

第三部分:是內(nèi)容提供者提供數(shù)據(jù)的某個子集,因為內(nèi)容提供者有時會提供多個數(shù)據(jù)集,我們具體是要訪問那個子集,需要把具體路徑標出來。如:content://

my_content_provider/

contancts表示可以訪問自定義的authority為“my_content_provider”的內(nèi)容提供者中的創(chuàng)建Content

Provider涉及到的方法對于其中涉及到的方法,含義如下:

o

n

C

re

a

te()方法:在初始化內(nèi)容提供者時調(diào)用。通常在這里完成數(shù)據(jù)庫的創(chuàng)建和升級等操作;

in

s

e

rt()方法:向內(nèi)容提供者中添加一條數(shù)據(jù)。使用uri參數(shù)確定要添加的表,待添加的數(shù)據(jù)保存在values參數(shù)中,添加完成后,返回一個用于表示這條新紀錄的Uri。

d

e

le

te()方法:從內(nèi)容提供者中刪除數(shù)據(jù)。使用uri參數(shù)來確定刪除哪一張表中的數(shù)據(jù),selection和selection

Args是刪除的約束條件。返回值為整數(shù)表示刪除的記錄的個數(shù);

u

p

d

a

te()方法:更新內(nèi)容提供者中已有的數(shù)據(jù),使用uri參數(shù)確定要修改的數(shù)據(jù)表,

values為要更新的數(shù)據(jù),返回修改的記錄的個數(shù);

q

u

e

ry()方法:此方法是從內(nèi)容提供者中查詢數(shù)據(jù)。使用uri確定要查詢的表,

projection參數(shù)用于確定查詢哪些列,selection和selection

Args是查詢的條件,

sort

Order參數(shù)表示是否對查詢結(jié)果排序。清單文件中聲明內(nèi)容提供者<providerandroid:

name=".

My

Content

Provider"

android:

authorities="

com.

example.

mycontacts"android:

enabled="

true"

android:

exported="

true"

></

provider>provider標記的各屬性含義如下:n

a

m

e:指明內(nèi)容提供者的名稱;

a

u

th

o

ritie

s

:用于標識內(nèi)容提供者提供的數(shù)據(jù),也是在其它應用程序中訪問共享數(shù)據(jù)時,設置Uri對象需要使用的值,這個屬性通常設置為包名;

e

n

a

b

le

d

:標識內(nèi)容提供者能否被系統(tǒng)實例化,默認值為true標識可以被系統(tǒng)實例化。當值為false時,不能被系統(tǒng)實例化;7.3.2訪問自定義通訊錄

以我們在SQLite中實現(xiàn)的通訊錄程序My

Contacts為基礎,新建一個項目共享

My

Contatcs中的數(shù)據(jù),運行程序效果如圖7-5所示,在這個項目中我們可以對數(shù)據(jù)進行增刪改查。下面我們再新建一個程序來操作My

Contacts中的數(shù)據(jù),實現(xiàn)不同應用程序間的數(shù)據(jù)共享。圖7-5程序間數(shù)據(jù)共享運行效果在MyContacts中添加數(shù)據(jù),查詢結(jié)果在ShareDate_MyContacts中修改如上數(shù)據(jù)查詢MyContacts中的數(shù)據(jù)7.3.2訪問自定義通訊錄分析:要實現(xiàn)不同程序間的數(shù)據(jù)共享,要解決兩個問題:第一個是如何將數(shù)據(jù)提供給其它程序;第二個問題是如何訪問并操作其它程序提供的數(shù)據(jù)解決思路:第一個問題,需要在應用程序中添加內(nèi)容提供者并實現(xiàn)數(shù)據(jù)操作的方法,以供其它程序訪問;

第二個問題,先使用Uri.parse()方法將一個內(nèi)容提供者解析成Uri對象,再使用

get

Content

Resolver()獲取Content

Resolver實例,然后使用

Content

Resolver實例的各種操作數(shù)據(jù)的方法。7.3.2訪問自定義通訊錄實現(xiàn)過程:第一步:打開第六章的項目M

y

C

o

n

ta

c

ts。第二步:創(chuàng)建內(nèi)容提供者并實現(xiàn)數(shù)據(jù)操作方法第三步:創(chuàng)建一個新的程序?qū)崿F(xiàn)數(shù)據(jù)共享第四步:設計用戶界面第五步:操作內(nèi)容提供者中的數(shù)據(jù)在Main

Activity中的on

Create()方法中對所有控件進行初始化,使用Uri.parse()方法將一個內(nèi)容提供者解析成Uri對象,然后使用get

Content

Resolver()獲取Content

Resolver實例resolver。定義Content

Values對象用來存放要添加,刪除,修改的數(shù)據(jù)。最后分別使用resolver.insert()方法,resolver.delete()方法,resolver.update()方法和resolver.query()方法對共享的數(shù)據(jù)進行增刪改查第六步:運行程序本章小結(jié)內(nèi)容提供者內(nèi)容提供者共享系統(tǒng)應用數(shù)據(jù)內(nèi)容提供者是不同應用程序之間數(shù)據(jù)共享的一種接口機制,使用

ContentProvider類將不同的應用程序的數(shù)據(jù)操作標準統(tǒng)一起來,這些標準在類中明確的通過方法進行定義。其它應用程在不知數(shù)據(jù)來源、路徑的情況下,可以對共享數(shù)據(jù)進行的增加,刪除,修改和查詢等操作。實現(xiàn)過程第一步:在清單文件中申請授權(quán)第二步:使用getContentResolver()方法獲取ContentResolver示例;第三步:使用ContentResolver提供方法操作數(shù)據(jù),如查詢:Cursor

cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);程序間數(shù)據(jù)共享應用場景:訪問其他應用中的現(xiàn)有內(nèi)容提供者,如系統(tǒng)通訊錄等;在自己的應用中創(chuàng)建新的內(nèi)容提供者,為其他應用共享數(shù)據(jù)創(chuàng)建內(nèi)容提供者:1新建一個類繼承自ContentProvider,重寫insert(),delete(),update()和query()等等的方法2在清單文件中使用<provider>標記聲明內(nèi)容提供者數(shù)據(jù)共享,至少涉及兩個應用程序,一個是內(nèi)容提供者的應用,

另一個是內(nèi)容訪問者的應用。自定義程序間數(shù)據(jù)共享與使用系統(tǒng)應用提供的數(shù)據(jù)的區(qū)別在于要求在內(nèi)容提供者應用中自定義內(nèi)容提供者,在內(nèi)容訪問者中通過Uri對象和ContentResolver對象

實現(xiàn)對數(shù)據(jù)的增加,刪除,修改和查詢等操作。第8章服務的應用學習目標理解服務的應用掌握服務啟動的兩種方法能夠熟練使用服務的應用8.1服務概述1服務簡介服務Service是一種可在后臺長時間執(zhí)行操作而不提供界面的應用組件,適合執(zhí)行不需要和用戶交互而且還需要長期運行的任務。服務可由其他應用組件啟動,而且即使用戶切換到其他應用,服務仍將在后臺繼續(xù)運行。此外,組件可通過綁定到服務與之進行交互,甚至是執(zhí)行進程間通信(IPC)。例如,服務可在后臺處理網(wǎng)絡事務,執(zhí)行文件I/O或與內(nèi)容提供程序進行交互。如要創(chuàng)建服務,必須創(chuàng)建繼承自Service的子類或者使用它的現(xiàn)有子類,重寫一些回調(diào)方法,并在清單文件中聲明。根據(jù)服務啟動方式的不同可以分為啟動服務和綁定服務。8.1服務概述2服務的創(chuàng)建當我們需要使用一個服務時,我們就需要創(chuàng)建服務,下面我們通過一個案例演示服務的創(chuàng)建,操作步驟如下。第一步新建項目新建一個項目命名為Service,所在包名為:com.example.service。第二步創(chuàng)建服務選擇程序的包名,點擊鼠標右如圖8-1所示的對話框。鍵,選擇“New”-->“Service”-->“Service”,彈出圖8-1新建Service的對話框服務的名稱服務的屬性在學習Activity時我們提到Activity必須在Android

Manifest.xml文件中注冊了才能用,對于服務也是一樣的。我們打開Android

Manifest.xml文件可以看到如下代碼:<serviceandroid:

name=".

My

Service"android:

enabled="

true"android:

exported="

true"

></

service>使用這種方法創(chuàng)建服務,Android

Studio會自動在清單文件Android

Manifest中增加<service>標記聲明新建的服務。如果是通過新建繼承Service類的方法創(chuàng)建服務,那么必須手動在Android

Manifest文件中添加<service>標記聲明服務。8.2啟動服務服務的啟動有兩種方式,一種是使用s

ta

rt

S

e

rv

ic

e()方法啟動,另一種是使用bind

Service()方法啟動。啟動服務是通過調(diào)用start

Service()方法的方式啟動服務,以這種方式啟動的服務會長期在后臺運行,服務的狀態(tài)與開啟者的狀態(tài)是沒有關(guān)系的。例如在一個

Activity中調(diào)用start

Service()方法啟動了一個服務,那么當這個Activity銷毀以后,服務依然在運行,也就是說即使啟動服務的組件已經(jīng)被銷毀,服務會依舊運行。1創(chuàng)建啟動服務啟動服務由另一個組件(如Activity)通過調(diào)用start

Service()方法啟動服務,服務啟動后,其生命周期即獨立于啟動它的組件,即使系統(tǒng)已銷毀啟動服務的組件,該服務仍可在后臺無限期地運行。因此,服務應在其工作完成時通過調(diào)用stop

Self()方法來自行停止運行,或者由另一個組件通過調(diào)用stop

Service()方法來將其停止。下面我們通過如圖8-2所示效果實例學習使用這種啟動方式如何來啟動服務和關(guān)閉服務,具體步驟如下:圖9-2啟動服務運行界面實現(xiàn)的核心思路:在My

Server.java中:在My

Service服務中重寫on

Create()方法,onstart

Commad()方法和

on

Destroy()方法,在這三個方法中分別通過Log.i()方法打印程序執(zhí)行時調(diào)用到的方法。在Main

Activity中實現(xiàn)單擊按鈕的點擊事件“啟動服務”命令按鈕的單擊事件在start

My

Service()方法中實現(xiàn),首先定義

了一個Intent對象,指明當前活動this和目標服務My

Service,然后通過調(diào)用start

Service()方法開啟Intent對象;“停止服務”命令按鈕的單擊事件在stop

My

Service()方法中實現(xiàn),通過調(diào)用stop

Service()方法關(guān)閉了Intent對象指定的服務My

Service。啟動服務的生命周期啟動服務的生命周期過程的方法依次為

on

Create()方法、onstart

Command()方法和on

Destroy()方法。其中:on

Create()方法:是在第一次創(chuàng)建服務的時候系統(tǒng)將調(diào)用此方法。如果服務已經(jīng)運行,則不會調(diào)用此方法,該方法只調(diào)用一次。onstart

Command()方法:當另一個組件通過調(diào)用start

Service()方法請求啟動服務時,系統(tǒng)將調(diào)用此方法。on

Destroy()方法:是在關(guān)閉服務是執(zhí)行的方法。使用start

Service()方法啟動的服務,啟動后就與啟動它的組件不相關(guān)了,停止服務只能使圖8-6啟動服務的生命周期8.3綁定服務綁定服務是在其他組件調(diào)用bind

Service()方法時創(chuàng)建的服務,其他組件通過

bind

Service()方法將服務與組件綁定,程序允許組件與服務交互,組件一旦退出或者調(diào)用unbind

Service()方法解綁服務,服務就會被銷毀。服務與組件的綁定就要用到我們之前在服務中重寫的on

Bind()方法。圖8-7

BindService運行界面核心思想:在My

Service類中定義一個類My

Binder,并讓它繼承自Binder,然后在這個類中又自定義了一個my

Method()方法,在on

Bind()方法中返回My

Binder的實例。重寫了父類on

Create()方法和on

Unbind()方法并各打印了一行日志。在Main

Activity中實現(xiàn)“綁定服務”,“與服務交互”和“解除綁定”的邏輯。實現(xiàn)綁定服務需要調(diào)用bind

Service()方法來實現(xiàn),bind

Service()方法的語法格式如下所示。核心思想:b

in

d

S

e

rv

ic

e(In

te

n

t

s

e

rv

ic

e,S

e

rv

ic

e

C

o

n

n

e

c

tio

n

c

o

n

n,in

t

fla

g

s);第一個參數(shù)service:用于指定要啟動的Service;第二個參數(shù)是conn:用于調(diào)用者(服務綁定的組件)與Service之間的連接狀態(tài),當調(diào)用者與Service連接成功時,程序會回調(diào)該對象的

on

Service

Connected(Component

Name

name,IBinder

service)方法。當調(diào)用者與Service斷開時,程序會調(diào)用該對象的

on

Service

Disconnected(Component

Name

name)方法;第三個參數(shù)flags:是一個標志位,表示組件綁定服務時是否自動創(chuàng)建Service(如果Service還未創(chuàng)建)。該參數(shù)可設置為0,是不自動創(chuàng)建Service,也可設置為“BIND_AUTO_CREATE”,表示自動創(chuàng)建Service。綁定服務的生命周期通過分析Bind

S

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論