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

下載本文檔

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

文檔簡介

四大組件之ServiceAndroid引入了Service的概念。ServiceAndroidService長期在運行,執(zhí)行不關(guān)乎界面的一些操作比如:網(wǎng)易服務,每隔VisibleprocessServiceprocessBackgroundprocess進AndroidAndroid但是當回收服務,可視,前臺這三種進程時,系統(tǒng)非必要情況下不會輕易回收,如果需要回收掉這三種進程,那么在系統(tǒng)內(nèi)存夠用時,會再給重新啟動進程;但是服務進程如果用戶手動的關(guān)閉服務,這時服務不會再重啟了。進運行著線程,Android應用程序剛啟動都會開啟一個進程給這個程序來使用。態(tài),Thread運行在空進,很容易的被銷毀了。如何使用在會執(zhí) mand(生命周期方法)(onStart()以過期的方法),如果發(fā)service 周期方法onReceive時,也是一個前臺進程 器 在src publicpublicclassMyServiceextendsService*publicIBinderonBind(Intentintent)return}*publicvoidonCreate()//得到相關(guān)的管理服務 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給該模擬器撥打 服務有兩種開啟方式,一個是直接onstart,另一個是綁定服務。startedservice(標準開啟模式被開啟的service通過其他組件調(diào)用startService()被創(chuàng)建。這種service可以無限地運行下去,必須調(diào)用stopSelf()方法或者其他組件調(diào)用stopService()方法來停止它。當service被停止時,系統(tǒng)會銷毀它。boundservice(綁定模式被綁定的service是當其他組件(一個客戶)調(diào)用bindService()來創(chuàng)建的。客戶可以IBinderserviceunbindService()方法來關(guān)閉這也就是說,你可以和一個已經(jīng)調(diào)用了startService()而被開啟的service進行綁定。比如,一個音樂service可能因調(diào)用startService()方法而被開啟了,稍后,可能用戶想要控制器或者得到一些當前歌曲的信息,可以通過bindService()將一個activity和service綁定。這種情況下,stopService()stopSelf()實際上并不能定成功,onBind只執(zhí)行一次,再次綁定,onBind不會執(zhí)行。傳入一個自定義的ServiceConnection用來接收IBinderServiceConnectiononServiceConnected(ComponentNamename,Ibinderbinder這個服務,調(diào)用生命周期方法onCreate()方法。unBindServiceonUnbind(),然后調(diào)用onDestory()銷毀服務。通過說是服務沒有被釋放。那么我們可以重寫activityonDestory用unbindService(),去顯示的解除與服務的綁定。serviceConnectiononbindibinder和activity一樣,service也有一系列的生命周期回調(diào)函數(shù),你可以實現(xiàn)它們來監(jiān)測service狀態(tài)的變化,并且在適當?shù)臅r候執(zhí)行適當?shù)墓ぷ?。publicpublicclassTestServiceextendsServiceintmStartMode;//indicateshowtobehaveiftheserviceiskilledIBindermBinder;//interfacefor sthatbindbooleanmAllowRebind;//indicateswhetheronRebindshouldbepublicvoidonCreate()//Theserviceisbeing}publicmand(Intentintent,intflags,intstartId)//Theserviceisstarting,duetoacalltoreturn}publicIBinderonBind(Intentintent)// isbindingtotheservicewithreturn}publicbooleanonUnbind(Intentintent)// shaveunboundwithreturn}publicvoidonRebind(Intentintent)// isbindingtotheservicewith//afteronUnbind()hasalreadybeen}publicvoidonDestroy()//Theserviceisnolongerusedandisbeing}}這個圖說明了service典型的回調(diào)方法,盡管這個圖中將開啟的service和綁定的()還是 startServicebindServiceIntent如果service是被開啟的,那么它的活動生命周期和整個生命周期一同結(jié)束。servicestopSelfstopService()來停止的,沒有一個對應的回調(diào)函數(shù)與之對應,即沒有onStop()回調(diào)方法。所以,當調(diào)用了停止的方法,除非這個service和客戶組件綁定,否則系統(tǒng)將會直接銷毀它,onDestory()方被 或另一個組件調(diào)用stopService(),不論它是否和客戶端綁定。時,如果你想要在下次客戶端綁定的時候接受一個onRebind()的調(diào)用(而不是調(diào)法中得到IBinder對象。在res 中拷貝進一個音樂文件,注意文件名必須遵循Android資源文件名規(guī)則。在src publicpublicclassMediaServiceextendsService 一個 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)閉!"}}新建一個classMediaConnectionimplementsServiceConnectionpublicvoidonServiceConnected(ComponentNamename,IBinderservice)//返回的IBinder對象其實就是我們自定義的MediaControllermediaController=(MediaController) } }}}<<service 放音樂沒能再次,因為這里面直接調(diào)用Media yer的stop方法是有bug的。因此為了解決這樣的問題,我們應該將停止調(diào)用層pause方法,同時只需調(diào)用 yer的seekTo(int)方法將音樂設置到開始位置。用)來完成進程之間的通信,并且Android通過接口定義語言(AndroidInterfaceDefinitionLanguage,AIDL)來生成兩個進程之間相互的代碼,例如,你在Activity里的代碼需要Service中的一個方法,那么就可以通過這種方式來實現(xiàn)了。預先定義的接口達到兩個進程內(nèi)部通信進程的目的.如果需要在一個Activity中,另一個Service中的某個對象,需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個參數(shù)),然后使用AIDL來傳遞這些參數(shù),在消息的接收端,使用這些參數(shù)組裝成自己需要的對象。AIDLRPCWindowsCOMCorba,但他是接口IBinder接口。aidl(gen),aidlcopyJavaStubextendsandroid.os.Binderimplements(繼承Binder)AIDLJavaString、List、Map,ListMap重寫publicvoidwriteToParcel(Parceldestint定義publicstaticfinal >package包名parcelablepackageinterfacebooleanforwardPayMoney(float}新創(chuàng)建一個Android工程《支付寶》,包名:com.itheima.alipay。在src下創(chuàng)packageinterfacebooleanforwardPayMoney(float} 然后還有一個抽象類Stub:繼承(實現(xiàn)AIDL在《支付寶》 下創(chuàng)建com.itheima.alipay.service包,在該包中新建一publicpublicclassAlipayServiceextendsServicepublicIBinderonBind(Intentintent)returnnew}publicboolean"+money);returntrue;}*StubIBinder接口,因此PayController**@authorwzyDec13,*publicclassPayControllerextendspublicbooleanforwardPayMoney(floatmoney)throwsRemoteExceptionreturn}}} <actionAndroidcom.itheima.shop。使用默認的布局文件和默認的MainActivity類。將《支付寶》工的AlipayRemoteService.aidl文件拷貝到《商戶》工程的src目戶》src結(jié)構(gòu)如下圖:<<LinearLayout tools:context=".MainActivity"> 服務"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.先將《支付寶》部署到模擬器,然后將《商戶》部署到模擬器,然后在《商戶》界面輸管理服務進行通信,并且調(diào)用服務中的api實現(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)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論