版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄6.1創(chuàng)建配置Service6.2啟動Service6.3IntentService的使用6.4遠程服務(AIDL)
六、Service六、Service
開發(fā)Service的步驟如下:(1)定義一個繼承Service的子類。(2)在清單文件中配置該Service。
Service生命周期方法:IBinderonBind(Intentintent):該方法是Service子類必須實現(xiàn)的方法。該方法返回一個IBinder對象,應用程序可通過該對象與Servcie組件通信。6.1創(chuàng)建配置Service六、ServicevoidonCreate():當該Service第一次被創(chuàng)建后將立即回調該方法。voidonDestroty():當該Service被關閉時會回調此方法。VoidonStartConmmand(Intentintent,intflags,intstartId):每次客戶端調用startService(Intent)方法啟動該Service時都會調用該方法。BooleanonUnbind(Intentintent):當該Service上綁定的所有客戶端都斷開連接時回調該方法。六、Service
通過Context的startService()方法啟動的服務,訪問者之間沒有關聯(lián),即使訪問者退出了,Service依然存在。1.創(chuàng)建項目
創(chuàng)建一個MyService類繼承Service:重寫onCreate(),onDestroy(),onStartCommand(Intentintent,intflags)方法。
6.2啟動Service6.2.1使用startService()啟動服務六、ServiceMyService.java文件:六、Service六、Service2.在清單文件中注冊Service:六、Service4.編寫MainActivity.java文件六、Service
在MainActivity.java類中,定義start(Viewview)方法,格式必須是publicvoidstart(Viewview),方法名必須與布局文件中綁定的方法名一樣。通過view.getId()方法得到觸發(fā)該點擊事件的控件。5.運行程序
主界面如圖所示。圖6.1六、Service點擊界面上的開啟按鈕,我們可以看到如圖所示的log輸出:圖6.2六、Service
當點擊開啟按鈕時,通過startService(Intentintnent)方法創(chuàng)建服務,可以看到當?shù)谝淮伍_啟服務的時候,首先調用了onCreate()方法,然后是onStartCommand()方法。
點擊界面上的停止按鈕,如圖所示。
在此點擊事件中使用stopService()關閉服務,服務將調用onDestroy()方法。圖6.3六、Service
如果Service與訪問者之間需要進行方法調用或者數(shù)據(jù)交換,應該使用BindService()方法啟動:BindService(Intentservice,ServiceConnectionconn,intflags):
參數(shù)service:該參數(shù)通過Intent指定要啟動的Service。
參數(shù)flags:指定綁定時是否自動創(chuàng)建Service(如果Service還未創(chuàng)建)。該參數(shù)可指定為0或者BIND_AUTO_CREATE(自動創(chuàng)建)。6.2.2使用BindService()啟動服務六、Service
參數(shù)conn:該參數(shù)是一個ServiceConnection對象,該對象用于監(jiān)聽訪問者與Service之間的連接情況。當訪問者與Service之間連接成功時將回調該ServiceConnection對象的onServiceConnected(ComponentNamename,IBinderservice)方法;當Service所在的宿主進程由于異常終止或由于其他原因終止,導致該Service與訪問者之間斷開連接時回調該對象的onServiceDisconnected(ComponentNamename)方法。六、Service
在ServiceConncetion對象的onServiceConnected方法中有一個IBinder對象,利用該對象可以實現(xiàn)與綁定的Service之間的通信。
當開發(fā)Service類時,該Service類必須提供一個IBinderonBind(Intentintent)方法,在綁定Service的情況下,onBind(Intentintent)方法返回的IBinder對象將會傳給ServiceConnection對象里的onServiceConnected()方法中的Service參數(shù),這樣訪問者就可通過該IBinder對象與Service進行通信。
開發(fā)時通常會采用繼承Binder(IBinder的實現(xiàn)類)的方式來實現(xiàn)自己的IBinder對象。六、Service示例:如何在Activity中綁定本地服務Service,并獲取Service的運行狀態(tài)。該程序的Service類需要“真正”實現(xiàn)OnBind()方法,并讓該方法返回一個有效的IBinder對象。MyBindService.java文件:六、Service六、Service六、Service
上面Service類實現(xiàn)了onBind()方法,該方法返回了一個可訪問該Service狀態(tài)數(shù)據(jù)(count)的IBinder對象,可以將該對象傳給Service的訪問者。
①號代碼通過繼承Binder類實現(xiàn)了一個IBinder對象,這個MyBinder對象是Service的內部類,這對于綁定本地Service并與之通信的場景是一種常見的情形。六、Service
接下來用一個Activity來綁定該Service,并在該Activity中通過MyBinder對象訪問Service的內部狀態(tài)。該Activity的界面上包含三個按鈕,第一個綁定Service,第二個解除綁定,第三個獲取Service的運行狀態(tài)。在布局文件中給三個按鈕綁定事件監(jiān)聽:MainActivity文件:六、Service
六、Service
六、Service
①號代碼用于在該Activity與Service連接成功時獲取Service的onBind()方法所返回的MyBinder對象;程序的②號代碼即可通過MyBinder對象來訪問Service的運行狀態(tài)。
運行該程序,單擊程序界面中的“綁定”按鈕,即可看到所示LogCat的輸出。圖6.4六、Service
綁定Service時,先啟動onCreate方法,再調用onBind方法,最后是ServiceConncetion中的onServiceConnected方法。點擊解除按鈕,LogCat輸出如圖所示圖6.5六、Service
點擊解除按鈕時,先調用onUnbind方法,然后是onDestroy方法。
再次點擊綁定后,綁定服務,點擊獲取按鈕,即可得到Service中的count值,如圖所示。圖6.6六、Service
IntentService是Service的子類,使用隊列來管理請求Intent,每當客戶端代碼通過Intent請求啟動IntentService時,IntentService會將該Intent加入隊列中,然后開啟一條新的工作線程來處理該Intent。處理異步的StartService()請求時IntentService會按次序依次處理隊列中的Intent,該線程保證同一時刻只處理一個Intent。由于IntentService使用新的工作線程處理Intent請求,因此IntentService不會阻塞主線程。
6.3IntentService的使用六、ServiceIntentService的特征:IntentService的內部已經創(chuàng)建了一個工作線程,服務一旦啟動,這個工作線程就會執(zhí)行。IntentService內部會有一個任務隊列,任務隊列的每一個任務會保存這次任務的intent對象,然后工作線程會依次從隊列中取出任務,并且調用IntentService中的onHandleIntent方法執(zhí)行該任務。
當任務隊列中所有的任務全部執(zhí)行完畢后,任務就會自然終止,不需要自己去終止服務。
如果主動去停止這個服務,那么IntentService會立即銷毀,但是他的工作線程不會立即退出,而是要把當前正在執(zhí)行的任務做完后自動退出,隊列中未執(zhí)行的任務不再執(zhí)行。六、Service示例:包含了兩個文本框、兩個按鈕。兩個按鈕分別啟動Service和IntentService,兩個Service都需要執(zhí)行耗時任務;兩個文本框用于顯示耗時任務所在的線程。六、Service
在MainActivity.java中,單擊相應按鈕時,LogCat會輸出相應的線程名以及執(zhí)行結果:六、Service六、Service
Activity的兩個事件處理方法中分別啟動MyService以及MyIntentService,其中MyService是繼承Service的子類,而MyIntentService是繼承了IntentService的子類。MyService類的代碼:六、Service六、ServiceMyService在onStartCommand方法中使用線程睡眠的方式模擬了耗時任務,睡眠了20秒,由于普通Service的執(zhí)行會阻塞主線程,因此啟動該服務將會導致程序出現(xiàn)ANR異常。
六、Service當點擊“打開Service”按鈕時,Logcat出現(xiàn)如圖所示日志:圖6.7六、ServiceMyService運行的線程Id與主線程運行的Id是相同,也就是說打開的Service是運行在主線程中,在主線程中執(zhí)行耗時任務將會出現(xiàn)ANR異常,執(zhí)行結果:圖6.8六、Service
點擊“打開IntentService”按鈕,查看LogCat輸出:
主線程Id與Service運行的線程Id是不一樣的,證明利用IntentService給耗時任務開設了新的線程,從而正常執(zhí)行耗時任務。當自定義的類繼承IntentService時,會自動增加帶參數(shù)的構造方法,當程序執(zhí)行時,會出現(xiàn)初始化錯誤,需要修改有參構造為無參構造。在構造方法中調用super(“servicename”),servicename即為開設的線程名。圖6.9六、Service
服務的分類:
本地服務:服務和啟動它的組件在同一個進程中。
遠程服務:服務和啟動它的組件在不同的進程中。
案例:跨進程通信,在一個進程中打開其他進程中的服務。該案例中用到了2個項目,一個是遠程服務的服務端,另一個是返回遠程服務的客服端。在客服端中,定義一個MyRemoteService類以及一個PublishFind接口。
MyRemoteService的代碼:
6.4遠程服務(AIDL)六、Service六、Service六、Service
在清單文件中注冊該service并且指定它的action:PublicFind.java:提供了一個find()方法。六、Service
客服端:新建一個項目,項目名為“開啟服務”。MainActivity的布局文件有5個按鈕,依次為開啟服務、關閉服務、綁定服務、解除綁定和遠程調用。布局文件如下:六、Service六、ServiceMainActivty中,當點擊開啟服務和關閉服務時代碼如下。其他幾個按鈕的點擊事件暫不處理,先觀察是否能遠程打開另外一個程序的服務:六、Service
上面代碼中使用隱式啟動服務(加粗部分所示)。先運行遠程服務端,運行后,再啟動客戶端。客服端運行如圖,依次點擊開啟服務和關閉服務。圖6.10六、Service點擊按鈕,觀察LogCat輸出,如圖:圖6.11六、ServiceAIDL:AndroidInterfaceDefinitionLanguage(安卓接口定義語言)。
作用:跨進程通信。
應用場景:遠程服務中的“代理”對象,其他應用是拿不到的,那么在通過綁定服務獲取“代理”對象時,就無法強制轉換。使用AIDL,就可以在其他應用中拿到“代理”類所實現(xiàn)的接口。
使用AIDL的步驟:(1)把遠程服務需要用到的遠程方法抽成一個單獨的接口java文件。(2)把接口java文件的后綴名改成aidl。六、Service
(3)在gen文件下一個自動生成的文件里,有一個靜態(tài)抽象類Stub,它已經繼承了Binder和實現(xiàn)“代理”接口,這個類就是新的“代理”類,繼承這個“代理”類即可。(4)把aidl文件復制粘貼到新的項目里面,aidl文件所在的包名必須跟遠程服務AIDL的包名完全一致,在新的項目也會自動生成Stub靜態(tài)類。(5)在客戶端的ServiceConncetion實現(xiàn)類中,直接使用Stub.asInterface(service)得到“代理”對象,通過“代理”對象調用遠程服務中的方法。
根據(jù)這5步來修改上一案例:
修改PublicFind.java類,改變后綴名為aidl,注意去掉接口的public修飾符,修改完成后,在gen文件夾下會自動生成一個PublicFind.java類,如圖所示。六、Service圖6.12六、Service
改變PublicFind的后綴名后,MyRemoteService將會報錯,修改后如圖:圖6.13六、Service
此時,“代理”對象不再繼承Binder實現(xiàn)PublicFind
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度港口碼頭船舶燃油供應租賃合同4篇
- 2025年度臨時施工圍擋租賃及城市景觀維護合同4篇
- 二零二五年度高性能鋁模施工分包合作協(xié)議4篇
- 二零二五年文化產業(yè)投資與版權合作合同協(xié)議書
- 二零二五年鍋爐安裝與節(jié)能政策支持合同
- 2025年洗車行員工培訓及招聘服務合同3篇
- 二零二五年度硫酸產品售后服務協(xié)議4篇
- 2025年度餐飲業(yè)顧客滿意度提升售后服務代理協(xié)議書3篇
- 二零二五版農產品儲藏租賃合同模板3篇
- 二零二五年度軟件開發(fā)與定制化解決方案技術服務合同規(guī)范3篇
- 銀行會計主管年度工作總結2024(30篇)
- 教師招聘(教育理論基礎)考試題庫(含答案)
- 2024年秋季學期學校辦公室工作總結
- 上海市12校2025屆高三第一次模擬考試英語試卷含解析
- 三年級數(shù)學(上)計算題專項練習附答案集錦
- 長亭送別完整版本
- 《鐵路軌道維護》課件-更換道岔尖軌作業(yè)
- 股份代持協(xié)議書簡版wps
- 職業(yè)學校視頻監(jiān)控存儲系統(tǒng)解決方案
- 《銷售心理學培訓》課件
- 2024年安徽省公務員錄用考試《行測》真題及解析
評論
0/150
提交評論