安卓核心基礎(chǔ)筆記android第八天_第1頁
安卓核心基礎(chǔ)筆記android第八天_第2頁
安卓核心基礎(chǔ)筆記android第八天_第3頁
安卓核心基礎(chǔ)筆記android第八天_第4頁
安卓核心基礎(chǔ)筆記android第八天_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

四大組件之ServiceAndroid引入了Service的概念。ServiceAndroidService長期在運(yùn)行,執(zhí)行不關(guān)乎界面的一些操作比如:網(wǎng)易服務(wù),每隔VisibleprocessServiceprocessBackgroundprocess進(jìn)AndroidAndroid但是當(dāng)回收服務(wù),可視,前臺這三種進(jìn)程時(shí),系統(tǒng)非必要情況下不會輕易回收,如果需要回收掉這三種進(jìn)程,那么在系統(tǒng)內(nèi)存夠用時(shí),會再給重新啟動(dòng)進(jìn)程;但是服務(wù)進(jìn)程如果用戶手動(dòng)的關(guān)閉服務(wù),這時(shí)服務(wù)不會再重啟了。進(jìn)運(yùn)行著線程,Android應(yīng)用程序剛啟動(dòng)都會開啟一個(gè)進(jìn)程給這個(gè)程序來使用。態(tài),Thread運(yùn)行在空進(jìn),很容易的被銷毀了。如何使用在會執(zhí) mand(生命周期方法)(onStart()以過期的方法),如果發(fā)service 周期方法onReceive時(shí),也是一個(gè)前臺進(jìn)程 器 在src publicpublicclassMyServiceextendsService*publicIBinderonBind(Intentintent)return}*publicvoidonCreate()//得到相關(guān)的管理服務(wù) ephonyManager= }classMyPhoneListenerextendsPhoneStaistener{MediaRecorderrecorder;booleanisCalling=false; publicvoidonCallStateChanged(intstate, ingNumber) isCalling=true;//MediaRecorderrecorder=newSimpleDateFormatformatnewStringdate=format.format(newtry{}catch(Exceptione){}{recorder.stop();//停止isCalling=false;}}}}}:狀態(tài): 處于zhuangt protectedprotectedvoidonCreate(BundlesavedInstanceState)Intentservice=newIntent();} <<service 文 權(quán)限將本工程部署到模擬器中,然后通過DDMS給該模擬器撥打 服務(wù)有兩種開啟方式,一個(gè)是直接onstart,另一個(gè)是綁定服務(wù)。startedservice(標(biāo)準(zhǔn)開啟模式被開啟的service通過其他組件調(diào)用startService()被創(chuàng)建。這種service可以無限地運(yùn)行下去,必須調(diào)用stopSelf()方法或者其他組件調(diào)用stopService()方法來停止它。當(dāng)service被停止時(shí),系統(tǒng)會銷毀它。boundservice(綁定模式被綁定的service是當(dāng)其他組件(一個(gè)客戶)調(diào)用bindService()來創(chuàng)建的??蛻艨梢訧BinderserviceunbindService()方法來關(guān)閉這也就是說,你可以和一個(gè)已經(jīng)調(diào)用了startService()而被開啟的service進(jìn)行綁定。比如,一個(gè)音樂service可能因調(diào)用startService()方法而被開啟了,稍后,可能用戶想要控制器或者得到一些當(dāng)前歌曲的信息,可以通過bindService()將一個(gè)activity和service綁定。這種情況下,stopService()stopSelf()實(shí)際上并不能定成功,onBind只執(zhí)行一次,再次綁定,onBind不會執(zhí)行。傳入一個(gè)自定義的ServiceConnection用來接收IBinderServiceConnectiononServiceConnected(ComponentNamename,Ibinderbinder這個(gè)服務(wù),調(diào)用生命周期方法onCreate()方法。unBindServiceonUnbind(),然后調(diào)用onDestory()銷毀服務(wù)。通過說是服務(wù)沒有被釋放。那么我們可以重寫activityonDestory用unbindService(),去顯示的解除與服務(wù)的綁定。serviceConnectiononbindibinder和activity一樣,service也有一系列的生命周期回調(diào)函數(shù),你可以實(shí)現(xiàn)它們來監(jiān)測service狀態(tài)的變化,并且在適當(dāng)?shù)臅r(shí)候執(zhí)行適當(dāng)?shù)墓ぷ鳌ublicpublicclassTestServiceextendsServiceintmStartMode;//indicateshowtobehaveiftheserviceiskilledIBindermBinder;//interfacefor sthatbindbooleanmAllowRebind;//indicateswhetheronRebindshouldbepublicvoidonCreate()//Theserviceisbeing}publicmand(Intentintent,intflags,intstartId)//Theserviceisstarting,duetoacalltoreturn}publicIBinderonBind(Intentintent)// isbindingtotheservicewithreturn}publicbooleanonUnbind(Intentintent)// shaveunboundwithreturn}publicvoidonRebind(Intentintent)// isbindingtotheservicewith//afteronUnbind()hasalreadybeen}publicvoidonDestroy()//Theserviceisnolongerusedandisbeing}}這個(gè)圖說明了service典型的回調(diào)方法,盡管這個(gè)圖中將開啟的service和綁定的()還是 startServicebindServiceIntent如果service是被開啟的,那么它的活動(dòng)生命周期和整個(gè)生命周期一同結(jié)束。servicestopSelfstopService()來停止的,沒有一個(gè)對應(yīng)的回調(diào)函數(shù)與之對應(yīng),即沒有onStop()回調(diào)方法。所以,當(dāng)調(diào)用了停止的方法,除非這個(gè)service和客戶組件綁定,否則系統(tǒng)將會直接銷毀它,onDestory()方被 或另一個(gè)組件調(diào)用stopService(),不論它是否和客戶端綁定。時(shí),如果你想要在下次客戶端綁定的時(shí)候接受一個(gè)onRebind()的調(diào)用(而不是調(diào)法中得到IBinder對象。在res 中拷貝進(jìn)一個(gè)音樂文件,注意文件名必須遵循Android資源文件名規(guī)則。在src publicpublicclassMediaServiceextendsService 一個(gè) yer對private publicIBinderonBind(Intentintent) returnnew}publicvoidonCreate() yer= yer.create(this,}//Binder對象,BinderIBinderclassMediaControllerextends }publicvoid} }publicint } publicint }publicboolean }}}tools:context=".MainActivity"> android:orientation="horizontal">"/>"/>publicpublicclassMainActivityextendsActivity privateProgressBar 自定義的MediaController對象privateMediaControllermediaController;privatebooleanisRunning;{super.onCreate(savedInstanceState);pb=(ProgressBar)類Intentintent=newIntent(this,isRunning=bindService(intent,newMediaConnection(),if(isRunning)}else}} privatevoidupdateProgressBar()newThread(newRunnable()publicvoidrun()while(true)if(mediaController.getDuration()==}}}}publicvoidy(Viewview)if(mediaController!=null)s,"音樂中",0).show();return;}elseToast.makeText(this,"音樂開是",}}}publicvoidpause(Viewview)if(mediaController!={}}publicvoidstop(Viewview)if(mediaController!=null)Toast.makeText(this"音樂已經(jīng)關(guān)閉!"}}新建一個(gè)classMediaConnectionimplementsServiceConnectionpublicvoidonServiceConnected(ComponentNamename,IBinderservice)//返回的IBinder對象其實(shí)就是我們自定義的MediaControllermediaController=(MediaController) } }}}<<service 放音樂沒能再次,因?yàn)檫@里面直接調(diào)用Media yer的stop方法是有bug的。因此為了解決這樣的問題,我們應(yīng)該將停止調(diào)用層pause方法,同時(shí)只需調(diào)用 yer的seekTo(int)方法將音樂設(shè)置到開始位置。用)來完成進(jìn)程之間的通信,并且Android通過接口定義語言(AndroidInterfaceDefinitionLanguage,AIDL)來生成兩個(gè)進(jìn)程之間相互的代碼,例如,你在Activity里的代碼需要Service中的一個(gè)方法,那么就可以通過這種方式來實(shí)現(xiàn)了。預(yù)先定義的接口達(dá)到兩個(gè)進(jìn)程內(nèi)部通信進(jìn)程的目的.如果需要在一個(gè)Activity中,另一個(gè)Service中的某個(gè)對象,需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個(gè)參數(shù)),然后使用AIDL來傳遞這些參數(shù),在消息的接收端,使用這些參數(shù)組裝成自己需要的對象。AIDLRPCWindowsCOMCorba,但他是接口IBinder接口。aidl(gen),aidlcopyJavaStubextendsandroid.os.Binderimplements(繼承Binder)AIDLJavaString、List、Map,ListMap重寫publicvoidwriteToParcel(Parceldestint定義publicstaticfinal >package包名parcelablepackageinterfacebooleanforwardPayMoney(float}新創(chuàng)建一個(gè)Android工程《支付寶》,包名:com.itheima.alipay。在src下創(chuàng)packageinterfacebooleanforwardPayMoney(float} 然后還有一個(gè)抽象類Stub:繼承(實(shí)現(xiàn)AIDL在《支付寶》 下創(chuàng)建com.itheima.alipay.service包,在該包中新建一publicpublicclassAlipayServiceextendsServicepublicIBinderonBind(Intentintent)returnnew}publicboolean"+money);returntrue;}*StubIBinder接口,因此PayController**@authorwzyDec13,*publicclassPayControllerextendspublicbooleanforwardPayMoney(floatmoney)throwsRemoteExceptionreturn}}} <actionAndroidcom.itheima.shop。使用默認(rèn)的布局文件和默認(rèn)的MainActivity類。將《支付寶》工的AlipayRemoteService.aidl文件拷貝到《商戶》工程的src目戶》src結(jié)構(gòu)如下圖:<<LinearLayout tools:context=".MainActivity"> 服務(wù)"publicpublicclassMainActivityextendsActivity AlipayRemoteServiceaidlprivateAlipayRemoteServiceprivateEditText{super.onCreate(savedInstanceState);et=(EditText)Intentintent=newIntent();booleanbindService=bindService(intent,newMyConnection(),if(bindService)}else}}publicvoidpay(Viewfloatmoney=try{Toast.makeText(this付款失敗},"",}classMyConnectionimplements*StubasInterfaceIBinderAlipayRemoteServicepublicvoidonServiceConnected(ComponentNamename,IBinderservice)}{}}}7.先將《支付寶》部署到模擬器,然后將《商戶》部署到模擬器,然后在《商戶》界面輸管理服務(wù)進(jìn)行通信,并且調(diào)用服務(wù)中的api實(shí)現(xiàn)通話結(jié)束IBinderbinder=method.invoke(null,newObject[]{ ephonyt=I 1、copyIBinderbinder=method.invoke(null,newObject[]{ ephonyt=I {super.onCreate(savedInstanceState);try{Methodmethod=Class.forName("android.os.Servi

溫馨提示

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

評論

0/150

提交評論