




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第七章內容提供者學習目標1理解跨應用數據共享的工作原理2掌握內容提供者的創建和定義3能夠實現不同應用程序之間的數據共享7.1內容提供者概述在Android中,每一個應用程序的數據都是采用私有的形式進行操作的,不管這些數據是用文件還是數據庫保存,都不能被外部應用程序訪問。在很多情況下,用戶需要在不同應用程序之間進行數據的共享,為了解決這類問題,Android專門提供了Content
Provider以實現不同應用程序之間的數據共享。通常,會在以下兩種場景中使用內容提供者:一是通過代碼訪問其他應用中的現有內容提供者,二是在應用中創建新的內容提供者,從而與其他應用共享數據。7.2訪問系統通訊錄
在Android中系統的許多應用都提供了內容提供者,其它應用程序可以訪問其中的數據。下面我們通過一個實例來訪問系統的通訊錄。
分析:對于系統通訊錄的訪問,由于通訊錄屬于危險權限,在應用時需要動態申請權限,實現步驟如下所示。1動態申請權限這里動態申請權限使用了request
Permissions()方法,此方法的原型如下所示:
request
Permissions(
final
@
Non
Null
Activity
activity,
final
@
Non
NullString[]
permissions,
final
@
Int
Range(
from
=
0
)
int
request
Code)
方法有三個參數,第一個參數為Activity,第二個參數為String[]表示需要申請的權限,如果有多個權限數組中添加數據元素就可以了。第三個參數為int類型,表示請求碼。2訪問系統通訊錄
對于每一個應用程序來說,如果想要訪問內容提供者中共享的數據,就一定要借助
Content
Resolver類。Content
Resolver可以與任意內容提供者進行會話,與其合作來對所有相關交互通訊進行管理。當外部應用需要對Content
Provider中的數據進行添加、刪除、修改和查詢操作時,通過get
Content
Resolver()方法獲取到
Content
Resolver類的實例。Content
Resolver中提供了一系列的方法用于對數據進行增刪改查操作。在上面的代碼中主要有以下幾點:(1
)get
Content
Resolver()方法:獲取Content
Resolver類的實例;
(2
)query()方法:用來查詢數據,它的用法與我們在SQLite中的用法一樣,它的第一個參數是要查詢的數據表;2訪問系統通訊錄(3
)Contacts
Contract.Common
Data
Kinds.Phone.CONTENT_URI:其中
Contacts
Contract.Common
Data
Kinds.Phone是系統封裝好的,
CONTENT_URI是一個常量,查看它的定義為:
public
static
final
Uri
CONTENT_URI
=
Uri.
with
Appended
Path(
Data.
CONTENT_URI,
"
phones");
可以看到CONTENT_URI就是Uri對象,我們在自定義內容提供者時會提到設置Uri,在訪問共享數據時通過Uri來找,而這里直接使用系統定義好的。(4
)Contacts
Contract.Common
Data
Kinds.Phone.DISPLAY_NAME和Contacts
Contract.Common
Data
Kinds.Phone.NUMBER分別為系統通訊錄中的用戶名和號碼。7.3程序間數據共享
內容提供者是Android的四大組件之一,它的創建與Activity的類似。下面我們演示如何創建內容提供者,創建Content
Provider。圖7-4新建Content
Provide的對話框
Uri是統一資源定位符,在內容提供者中Uri代表了要操作的數據,每個內容提供者中都會對外提供一個公共的Uri對象,當應用程序數據需要共享時,其它的應用程
序就可以通過Content
Provider傳入這個Uri來對數據進行操作。Uri的格式如下所示:content://authority//path有三個部分組成。第一部分:“content://”是系統規定的固定寫法;
第二部分:authority是一個標志,是內容提供者的字符串,也就是該內容提供者的標識符,相當于我們每個人都有的姓名;
第三部分:是內容提供者提供數據的某個子集,因為內容提供者有時會提供多個數據集,我們具體是要訪問那個子集,需要把具體路徑標出來。如:content://
my_content_provider/
contancts表示可以訪問自定義的authority為“my_content_provider”的內容提供者中的創建Content
Provider涉及到的方法對于其中涉及到的方法,含義如下:
o
n
C
re
a
te()方法:在初始化內容提供者時調用。通常在這里完成數據庫的創建和升級等操作;
in
s
e
rt()方法:向內容提供者中添加一條數據。使用uri參數確定要添加的表,待添加的數據保存在values參數中,添加完成后,返回一個用于表示這條新紀錄的Uri。
d
e
le
te()方法:從內容提供者中刪除數據。使用uri參數來確定刪除哪一張表中的數據,selection和selection
Args是刪除的約束條件。返回值為整數表示刪除的記錄的個數;
u
p
d
a
te()方法:更新內容提供者中已有的數據,使用uri參數確定要修改的數據表,
values為要更新的數據,返回修改的記錄的個數;
q
u
e
ry()方法:此方法是從內容提供者中查詢數據。使用uri確定要查詢的表,
projection參數用于確定查詢哪些列,selection和selection
Args是查詢的條件,
sort
Order參數表示是否對查詢結果排序。清單文件中聲明內容提供者<providerandroid:
name=".
My
Content
Provider"
android:
authorities="
com.
example.
mycontacts"android:
enabled="
true"
android:
exported="
true"
></
provider>provider標記的各屬性含義如下:n
a
m
e:指明內容提供者的名稱;
a
u
th
o
ritie
s
:用于標識內容提供者提供的數據,也是在其它應用程序中訪問共享數據時,設置Uri對象需要使用的值,這個屬性通常設置為包名;
e
n
a
b
le
d
:標識內容提供者能否被系統實例化,默認值為true標識可以被系統實例化。當值為false時,不能被系統實例化;7.3.2訪問自定義通訊錄
以我們在SQLite中實現的通訊錄程序My
Contacts為基礎,新建一個項目共享
My
Contatcs中的數據,運行程序效果如圖7-5所示,在這個項目中我們可以對數據進行增刪改查。下面我們再新建一個程序來操作My
Contacts中的數據,實現不同應用程序間的數據共享。圖7-5程序間數據共享運行效果在MyContacts中添加數據,查詢結果在ShareDate_MyContacts中修改如上數據查詢MyContacts中的數據7.3.2訪問自定義通訊錄分析:要實現不同程序間的數據共享,要解決兩個問題:第一個是如何將數據提供給其它程序;第二個問題是如何訪問并操作其它程序提供的數據解決思路:第一個問題,需要在應用程序中添加內容提供者并實現數據操作的方法,以供其它程序訪問;
第二個問題,先使用Uri.parse()方法將一個內容提供者解析成Uri對象,再使用
get
Content
Resolver()獲取Content
Resolver實例,然后使用
Content
Resolver實例的各種操作數據的方法。7.3.2訪問自定義通訊錄實現過程:第一步:打開第六章的項目M
y
C
o
n
ta
c
ts。第二步:創建內容提供者并實現數據操作方法第三步:創建一個新的程序實現數據共享第四步:設計用戶界面第五步:操作內容提供者中的數據在Main
Activity中的on
Create()方法中對所有控件進行初始化,使用Uri.parse()方法將一個內容提供者解析成Uri對象,然后使用get
Content
Resolver()獲取Content
Resolver實例resolver。定義Content
Values對象用來存放要添加,刪除,修改的數據。最后分別使用resolver.insert()方法,resolver.delete()方法,resolver.update()方法和resolver.query()方法對共享的數據進行增刪改查第六步:運行程序本章小結內容提供者內容提供者共享系統應用數據內容提供者是不同應用程序之間數據共享的一種接口機制,使用
ContentProvider類將不同的應用程序的數據操作標準統一起來,這些標準在類中明確的通過方法進行定義。其它應用程在不知數據來源、路徑的情況下,可以對共享數據進行的增加,刪除,修改和查詢等操作。實現過程第一步:在清單文件中申請授權第二步:使用getContentResolver()方法獲取ContentResolver示例;第三步:使用ContentResolver提供方法操作數據,如查詢:Cursor
cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);程序間數據共享應用場景:訪問其他應用中的現有內容提供者,如系統通訊錄等;在自己的應用中創建新的內容提供者,為其他應用共享數據創建內容提供者:1新建一個類繼承自ContentProvider,重寫insert(),delete(),update()和query()等等的方法2在清單文件中使用<provider>標記聲明內容提供者數據共享,至少涉及兩個應用程序,一個是內容提供者的應用,
另一個是內容訪問者的應用。自定義程序間數據共享與使用系統應用提供的數據的區別在于要求在內容提供者應用中自定義內容提供者,在內容訪問者中通過Uri對象和ContentResolver對象
實現對數據的增加,刪除,修改和查詢等操作。第8章服務的應用學習目標理解服務的應用掌握服務啟動的兩種方法能夠熟練使用服務的應用8.1服務概述1服務簡介服務Service是一種可在后臺長時間執行操作而不提供界面的應用組件,適合執行不需要和用戶交互而且還需要長期運行的任務。服務可由其他應用組件啟動,而且即使用戶切換到其他應用,服務仍將在后臺繼續運行。此外,組件可通過綁定到服務與之進行交互,甚至是執行進程間通信(IPC)。例如,服務可在后臺處理網絡事務,執行文件I/O或與內容提供程序進行交互。如要創建服務,必須創建繼承自Service的子類或者使用它的現有子類,重寫一些回調方法,并在清單文件中聲明。根據服務啟動方式的不同可以分為啟動服務和綁定服務。8.1服務概述2服務的創建當我們需要使用一個服務時,我們就需要創建服務,下面我們通過一個案例演示服務的創建,操作步驟如下。第一步新建項目新建一個項目命名為Service,所在包名為:com.example.service。第二步創建服務選擇程序的包名,點擊鼠標右如圖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>使用這種方法創建服務,Android
Studio會自動在清單文件Android
Manifest中增加<service>標記聲明新建的服務。如果是通過新建繼承Service類的方法創建服務,那么必須手動在Android
Manifest文件中添加<service>標記聲明服務。8.2啟動服務服務的啟動有兩種方式,一種是使用s
ta
rt
S
e
rv
ic
e()方法啟動,另一種是使用bind
Service()方法啟動。啟動服務是通過調用start
Service()方法的方式啟動服務,以這種方式啟動的服務會長期在后臺運行,服務的狀態與開啟者的狀態是沒有關系的。例如在一個
Activity中調用start
Service()方法啟動了一個服務,那么當這個Activity銷毀以后,服務依然在運行,也就是說即使啟動服務的組件已經被銷毀,服務會依舊運行。1創建啟動服務啟動服務由另一個組件(如Activity)通過調用start
Service()方法啟動服務,服務啟動后,其生命周期即獨立于啟動它的組件,即使系統已銷毀啟動服務的組件,該服務仍可在后臺無限期地運行。因此,服務應在其工作完成時通過調用stop
Self()方法來自行停止運行,或者由另一個組件通過調用stop
Service()方法來將其停止。下面我們通過如圖8-2所示效果實例學習使用這種啟動方式如何來啟動服務和關閉服務,具體步驟如下:圖9-2啟動服務運行界面實現的核心思路:在My
Server.java中:在My
Service服務中重寫on
Create()方法,onstart
Commad()方法和
on
Destroy()方法,在這三個方法中分別通過Log.i()方法打印程序執行時調用到的方法。在Main
Activity中實現單擊按鈕的點擊事件“啟動服務”命令按鈕的單擊事件在start
My
Service()方法中實現,首先定義
了一個Intent對象,指明當前活動this和目標服務My
Service,然后通過調用start
Service()方法開啟Intent對象;“停止服務”命令按鈕的單擊事件在stop
My
Service()方法中實現,通過調用stop
Service()方法關閉了Intent對象指定的服務My
Service。啟動服務的生命周期啟動服務的生命周期過程的方法依次為
on
Create()方法、onstart
Command()方法和on
Destroy()方法。其中:on
Create()方法:是在第一次創建服務的時候系統將調用此方法。如果服務已經運行,則不會調用此方法,該方法只調用一次。onstart
Command()方法:當另一個組件通過調用start
Service()方法請求啟動服務時,系統將調用此方法。on
Destroy()方法:是在關閉服務是執行的方法。使用start
Service()方法啟動的服務,啟動后就與啟動它的組件不相關了,停止服務只能使圖8-6啟動服務的生命周期8.3綁定服務綁定服務是在其他組件調用bind
Service()方法時創建的服務,其他組件通過
bind
Service()方法將服務與組件綁定,程序允許組件與服務交互,組件一旦退出或者調用unbind
Service()方法解綁服務,服務就會被銷毀。服務與組件的綁定就要用到我們之前在服務中重寫的on
Bind()方法。圖8-7
BindService運行界面核心思想:在My
Service類中定義一個類My
Binder,并讓它繼承自Binder,然后在這個類中又自定義了一個my
Method()方法,在on
Bind()方法中返回My
Binder的實例。重寫了父類on
Create()方法和on
Unbind()方法并各打印了一行日志。在Main
Activity中實現“綁定服務”,“與服務交互”和“解除綁定”的邏輯。實現綁定服務需要調用bind
Service()方法來實現,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);第一個參數service:用于指定要啟動的Service;第二個參數是conn:用于調用者(服務綁定的組件)與Service之間的連接狀態,當調用者與Service連接成功時,程序會回調該對象的
on
Service
Connected(Component
Name
name,IBinder
service)方法。當調用者與Service斷開時,程序會調用該對象的
on
Service
Disconnected(Component
Name
name)方法;第三個參數flags:是一個標志位,表示組件綁定服務時是否自動創建Service(如果Service還未創建)。該參數可設置為0,是不自動創建Service,也可設置為“BIND_AUTO_CREATE”,表示自動創建Service。綁定服務的生命周期通過分析Bind
S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公共服務的數字化轉型與區塊鏈技術的作用
- AI驅動的智能醫療服務模式創新研究
- 從企業辦公到個人生活探討區塊鏈技術的多元化應用
- 石油入股協議書范本合同
- 直播切片授權合同協議
- 直播帶貨場地合同協議
- 租營業執照合同協議
- 租租賃協議和租賃合同
- 砂石保管協議書范本
- 碧桂園精裝合同協議
- 2025-2030鱗狀非小細胞肺癌治療學行業市場現狀供需分析及重點企業投資評估規劃分析研究報告
- 鮮繭采購合同范本
- 陪診師考試2024年全真模擬試題及答案
- 2025年安陽學院單招職業技能考試題庫必考題
- 留罐法傳統康復技術針灸技術課件
- 2025年陪玩培訓考試題及答案
- 發展銀發經濟的理論依據與實踐路徑研究
- 2024年恒豐銀行招聘筆試真題
- 課程顧問電話銷售流程
- 陜西省關于低空經濟政策
- 2025年度礦山買賣中介服務傭金結算協議
評論
0/150
提交評論