




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、03進(jìn)階篇Android移動(dòng)開(kāi)發(fā)項(xiàng)目化教程本章導(dǎo)讀Service是Android四大組件中與Activity最相似的組件,它們都代表可執(zhí)行的程序。Service一旦被啟動(dòng)起來(lái),就與Activity一樣,完全具有自己的生命周期。Service與Activity的區(qū)別在于:Service一直在后臺(tái)運(yùn)行,它沒(méi)有用戶界面,所以絕不會(huì)到前臺(tái)來(lái)。因此,如果某個(gè)程序組件需要在運(yùn)行時(shí)向用戶呈現(xiàn)某種界面,或者該程序需要與用戶交互,就需要使用Activity,否則就應(yīng)該考慮使用Service了。項(xiàng)目十四Service生命周期項(xiàng)目要求了解Service是什么,有什么用途。掌握Service的生命周期,了解大體工作流
2、程。熟悉Service的兩種啟動(dòng)方式,學(xué)會(huì)使用Service。項(xiàng)目十四Service生命周期01Service簡(jiǎn)介Service是Android系統(tǒng)中的四大組件之一,它是一種長(zhǎng)生命周期的、沒(méi)有可視化界面、運(yùn)行于后臺(tái)的一種服務(wù)程序。比如我們播放音樂(lè)的時(shí)候,有可能想邊聽(tīng)音樂(lè)邊干些其他事情,當(dāng)退出播放音樂(lè)的應(yīng)用,如果不用Service,我們就聽(tīng)不到歌了。服務(wù)主要用于兩個(gè)目的:后臺(tái)運(yùn)行和跨進(jìn)程訪問(wèn)。通過(guò)啟動(dòng)一個(gè)服務(wù),可以在不顯示界面的前提下在后臺(tái)運(yùn)行指定的項(xiàng)目,這樣可以不影響用戶做其他的事情。通過(guò)AIDL服務(wù)可以實(shí)現(xiàn)不同進(jìn)程之間的通信,這也是服務(wù)的重要用途之一。項(xiàng)目十四Service生命周期02Ser
3、vice生命周期Service的生命周期并不像Activity那么復(fù)雜,它只繼承了onCreate(),onStartCommend(),onDestroy()三個(gè)方法,當(dāng)?shù)谝淮螁?dòng)Service時(shí),先后調(diào)用了onCreate()和onStart()這兩個(gè)方法,當(dāng)停止Service時(shí),則執(zhí)行onDestroy()方法,這里需要注意的是,如果Service已經(jīng)啟動(dòng)了,當(dāng)我們?cè)俅螁?dòng)Service時(shí),不會(huì)再執(zhí)行onCreate()方法,而是直接執(zhí)行onStart()方法。項(xiàng)目十四Service生命周期Android下的Service生命周期分為未綁定Activity的service和綁定了Acti
4、vity的service。兩種不同service服務(wù)的生命周期圖示如圖14-1所示。圖14-1 service生命周期示意圖項(xiàng)目十四Service生命周期未綁定Activity的Service必須通過(guò)startService()方法啟動(dòng),生命周期依次包含了創(chuàng)建onCreate(),開(kāi)始o(jì)nStartCommand(),銷(xiāo)毀onDestory()三個(gè)方法。其中創(chuàng)建方法onCreate()和銷(xiāo)毀方法onDestory()只被調(diào)用一次,開(kāi)始方法onStartCommand()方法可以被調(diào)用多次。綁定了Activity的Service通過(guò)bindService()方法啟動(dòng),生命周期包括創(chuàng)建onCrea
5、te()、綁定onBind()、解綁onUnbind()和銷(xiāo)毀onDestory()四個(gè)方法。其中創(chuàng)建和銷(xiāo)毀、綁定和解綁方法是對(duì)應(yīng)的,都只執(zhí)行一次。項(xiàng)目十四Service生命周期什么是AIDL?AIDL全稱(chēng)是Android Interface Definition Language,這是一種接口定義語(yǔ)言,采用遠(yuǎn)程過(guò)程調(diào)用(Remote Procedure Call,RPC)方式實(shí)現(xiàn)。這些服務(wù)可以被其他應(yīng)用程序訪問(wèn)。建立AIDL服務(wù)分為以下幾個(gè)步驟:(1)在Android工程的Java源目錄中建立一個(gè)擴(kuò)展名為aidl的文件。(2)建立aidl文件的內(nèi)容正確,ADT會(huì)自動(dòng)生成一個(gè)Java接口文件(
6、*.Java)。(3)建立一個(gè)服務(wù)類(lèi)(Service子類(lèi))。(4)實(shí)現(xiàn)由aidl文件生成的Java接口。(5)在AndroidManifest.xml文件中配置AIDL服務(wù),標(biāo)簽中android:name的屬性值就是客戶端要引用的該服務(wù)的ID,也就是Intent類(lèi)構(gòu)造方法的參數(shù)值。03跨進(jìn)程服務(wù)簡(jiǎn)介項(xiàng)目十四Service生命周期項(xiàng)目十四Service生命周期工程創(chuàng)建01參考前面實(shí)驗(yàn)中創(chuàng)建“Helloworld”工程的步驟創(chuàng)建一個(gè)工程(如AndroidCode14),工程目錄結(jié)構(gòu),如圖14-2所示。圖14-2 工程目錄結(jié)構(gòu)圖XML布局文件的開(kāi)發(fā)02界面采用相對(duì)布局管理器(垂直),里面再包含一個(gè)表
7、格布局(水平),這個(gè)表格布局里包含四個(gè)Button(分別是啟動(dòng)服務(wù)、停止服務(wù)、綁定服務(wù)、解綁服務(wù)),表格布局下面是一個(gè)Button(退出程序),界面如圖14-3所示。1圖14-3 界面設(shè)置項(xiàng)目十四Service生命周期界面設(shè)計(jì)完整代碼。(見(jiàn)書(shū)中詳細(xì)代碼)2按【Ctrl+S】組合鍵保存后退出,至此界面文件就編寫(xiě)完成了。3項(xiàng)目十四Service生命周期Java文件的開(kāi)發(fā)03在MainActivity中定義開(kāi)啟服務(wù)、停止服務(wù)、綁定服務(wù)、解綁服務(wù)和退出5個(gè)Button按鈕并初始化。初始化控件對(duì)象,使程序運(yùn)行時(shí)候的控件顯示和XML文件中繪制好的控件關(guān)聯(lián)起來(lái),對(duì)控件的操作就是對(duì)圖形化界面上按鈕的操作:1項(xiàng)
8、目十四Service生命周期程序由三個(gè)類(lèi)文件組成:MainActivity(主界面),MyBroadcastReceiver(廣播類(lèi))和MyService(服務(wù)類(lèi))。廣播類(lèi)用戶接收程序發(fā)送的信息并處理相關(guān)操作。Button btnStartService, btnStopService, btnBindService, btnUnbindService,btnExit;項(xiàng)目十四Service生命周期給5個(gè)Button按鈕設(shè)定監(jiān)聽(tīng)器,單擊按鈕時(shí)觸發(fā)監(jiān)聽(tīng)器,對(duì)應(yīng)不同按鈕監(jiān)聽(tīng)器做出不同的響應(yīng)。btnStartService = (Button) findViewById(R.id.btn_start
9、_service);btnStopService = (Button) findViewById(R.id.btn_stop_service);btnBindService = (Button) findViewById(R.id.btn_bind_service);btnUnbindService = (Button) findViewById(R.id.btn_unbind_service);btnExit=(Button)findViewById(R.id.btn_exit);項(xiàng)目十四Service生命周期對(duì)應(yīng)五個(gè)按鈕的intent服務(wù),分別對(duì)應(yīng)啟動(dòng)服務(wù)、停止服務(wù)、綁定服務(wù)和解綁服務(wù)。p
10、ublic void onClick(View v) Intent intent = new Intent();intent.setClass(context, MyService.class);switch (v.getId() / 啟動(dòng)服務(wù)case R.id.btn_start_service:context.startService(intent);break;/ 停止服務(wù)case R.id.btn_stop_service:context.stopService(intent);break;項(xiàng)目十四Service生命周期/ 綁定服務(wù)case R.id.btn_bind_service:
11、context.bindService(intent, serviceConnection, BIND_AUTO_CREATE);break;/ 解綁服務(wù)case R.id.btn_unbind_service:context.unbindService(serviceConnection);break;case R.id.btn_exit:unregisterReceiver(receiver);finish();break;default:break;項(xiàng)目十四Service生命周期public void onReceive(Context context, Intent intent) /
12、 TODO Auto-generated method stubString action = intent.getAction();if (action.equals(update) String time = intent.getExtras().getString(time);System.out.println(time);System.out.println(=+mContext);在MyBroadcastReceiver類(lèi)中重寫(xiě)onReceive方法,該方法用于接收update更新的廣播信息,當(dāng)程序收到內(nèi)容為“update”的action時(shí)輸出當(dāng)前時(shí)間:2項(xiàng)目十四Service生命
13、周期public void onCreate() Log.i(TAG, 啟動(dòng)服務(wù));Toast.makeText(mContext, 啟動(dòng)服務(wù), Toast.LENGTH_SHORT).show();/ 開(kāi)啟計(jì)數(shù)new Thread(new Runnable() Overridepublic void run() / TODO Auto-generated method stubwhile (!flag) try 在MyService類(lèi)中的關(guān)鍵代碼說(shuō)明:Service類(lèi)里的代碼就是單擊不同Button按鈕時(shí)所觸發(fā)的相應(yīng)操作,此服務(wù)在后臺(tái)運(yùn)行。在MyService類(lèi)中編寫(xiě)代碼,實(shí)現(xiàn)開(kāi)啟服務(wù),關(guān)閉
14、服務(wù),綁定服務(wù),解綁服務(wù)的方法。新建一個(gè)Thread線程每隔一秒鐘輸出當(dāng)前的精確時(shí)間,并用intent傳遞數(shù)據(jù)給接收器使用。3項(xiàng)目十四Service生命周期Thread.sleep(1000);Log.i(TAG, now time= + getSystemTime(); / 發(fā)送消息String str = current time:+getSystemTime();intent = new Intent();intent.setAction(update);intent.putExtra(time, str);mContext.sendBroadcast(intent); catch (E
15、xception e) / TODO: handle exception ).start();super.onCreate();項(xiàng)目十四Service生命周期在onDestory()方法中新建一個(gè)Thread線程暫停1s,然后打印輸出“服務(wù)停止”:Overridepublic void onDestroy() flag = true;try Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch blocke.printStackTrace();Log.i(TAG, 停止服務(wù));Toast.m
16、akeText(mContext, 停止服務(wù), Toast.LENGTH_SHORT).show();super.onDestroy();項(xiàng)目十四Service生命周期在onStartCommand方法中輸出開(kāi)始的命令,在log輸出結(jié)果中可以看到當(dāng)程序結(jié)束時(shí)候,不管是否已經(jīng)關(guān)閉服務(wù),服務(wù)都會(huì)被終止。public int onStartCommand(Intent intent, int flags, int startId) Log.i(TAG, onStartCommand().);return super.onStartCommand(intent, flags, startId);項(xiàng)目十
17、四Service生命周期onUnbind方法用于解除服務(wù)的綁定,當(dāng)服務(wù)綁定解除,程序退出以后服務(wù)也跟著退出。AndroidManifest文件的配置:因?yàn)樾枰褂米远x的服務(wù)和全局廣播,所以必須在AndroidManifest中添加注冊(cè)服務(wù)和廣播的聲明:擴(kuò)展練習(xí)04在service中加入一個(gè)循環(huán)打印消息,通過(guò)startService方式啟動(dòng)服務(wù),查看LogCat輸出信息,關(guān)閉程序查看LogCat中的信息,如圖14-4所示。1項(xiàng)目十四Service生命周期圖14-4 循環(huán)輸出service信息使用bindService方式啟動(dòng)服務(wù),查看LogCat輸出信息,關(guān)閉程序查看LogCat輸出信息,如圖
18、14-5所示。2項(xiàng)目十四Service生命周期圖14-5 bindService方式服務(wù)在程序中加入例如:log.d(debug,1),按照service中各回調(diào)函數(shù)執(zhí)行的順序不同,依次在LogCat中打印輸出1、2、3、4,如圖14-6所示。3項(xiàng)目十四Service生命周期圖14-6 生命周期執(zhí)行順序項(xiàng)目驗(yàn)證05將Android開(kāi)發(fā)終端與PC機(jī)相連。單擊程序圖標(biāo)進(jìn)入程序,單擊“start service”按鈕開(kāi)啟服務(wù),并查看log輸出順序是否如圖14-7所示。1項(xiàng)目十四Service生命周期圖14-7 開(kāi)啟服務(wù)后的log顯示單擊“stop service”停止服務(wù),查看LogCat輸出是否如圖14-8所示。2項(xiàng)目十四Service生命周期圖14-8 停止服務(wù)的log顯示在開(kāi)啟了服務(wù)的情況下直接單擊“e運(yùn)行。重新進(jìn)入程序,單擊“bind service”按鈕綁定程序,查看log輸出順序,如圖14-9所示。xi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)冰棗烏龍茶數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 統(tǒng)編版二年級(jí)語(yǔ)文下冊(cè)期末達(dá)標(biāo)測(cè)試卷(全真練習(xí)二)(含答案)
- 北京市昌平區(qū)2024-2025學(xué)年高一上學(xué)期期末質(zhì)量抽測(cè)物理試卷(含答案)
- 規(guī)劃快題測(cè)試題及答案
- 高一英語(yǔ)衡水試題及答案
- 2022-2023學(xué)年廣東省廣州七中七年級(jí)(下)期中數(shù)學(xué)試卷(含答案)
- 2024甘肅省蘭州市中考英語(yǔ)真題【原卷版】
- 遺產(chǎn)繼承遺產(chǎn)轉(zhuǎn)讓合同(2篇)
- 采購(gòu)與分包責(zé)任清單合同(2篇)
- 2025年法律知識(shí)競(jìng)賽試題及答案
- 中國(guó)常見(jiàn)食物營(yíng)養(yǎng)成分表
- 光伏車(chē)棚方案
- 基于語(yǔ)文核心素養(yǎng)的初中語(yǔ)文綜合性學(xué)習(xí)教學(xué)策略研究
- 工藝部述職報(bào)告
- 廣東中考美術(shù)知識(shí)點(diǎn)
- 臨床科室科研用藥管理制度
- 多層光柵結(jié)構(gòu)的防偽技術(shù)研究
- 《國(guó)有企業(yè)采購(gòu)操作規(guī)范》【2023修訂版】
- 五年級(jí)語(yǔ)文下冊(cè)第五單元【教材解讀】-【單元先導(dǎo)課】
- DQ-廠房設(shè)施設(shè)計(jì)確認(rèn)方案
- 常用中藥飲片介紹PPT幻燈片
評(píng)論
0/150
提交評(píng)論