一.Service的第一種啟動(dòng)方式
采用start的方式開啟服務(wù)
使用Service的步驟:
1.定義一個(gè)類繼承Service
2.在Manifest.xml文件中配置該Service
3.使用Context的startService(Intent)方法啟動(dòng)該Service
4.不再使用時(shí),調(diào)用stopService(Intent)方法停止該服務(wù)
使用這種start方式啟動(dòng)的Service的生命周期如下:
onCreate()--->onStartCommand()(onStart()方法已過時(shí)) --->onDestory()
說明:如果服務(wù)已經(jīng)開啟,不會(huì)重復(fù)的執(zhí)行onCreate(), 而是會(huì)調(diào)用onStart()和onStartCommand()。
服務(wù)停止的時(shí)候調(diào)用onDestory()秋冰。服務(wù)只會(huì)被停止一次。
特點(diǎn):一旦服務(wù)開啟跟調(diào)用者(開啟者)就沒有任何關(guān)系了值戳。
開啟者退出了吏饿,開啟者掛了,服務(wù)還在后臺(tái)長期的運(yùn)行笆怠。
開啟者不能調(diào)用服務(wù)里面的方法铝耻。
二.Service的第二種啟動(dòng)方式
采用bind的方式開啟服務(wù)
使用Service的步驟:
1.定義一個(gè)類繼承Service
2.在Manifest.xml文件中配置該Service
3.使用Context的bindService(Intent, ServiceConnection, int)方法啟動(dòng)該Service
4.不再使用時(shí),調(diào)用unbindService(ServiceConnection)方法停止該服務(wù)
使用這種start方式啟動(dòng)的Service的生命周期如下:
onCreate()--->onBind()--->onunbind()--->onDestory()
注意:綁定服務(wù)不會(huì)調(diào)用onstart()或者onstartcommand()方法
特點(diǎn):bind的方式開啟服務(wù)蹬刷,綁定服務(wù)瓢捉,調(diào)用者掛了,服務(wù)也會(huì)跟著掛掉办成。
綁定者可以調(diào)用服務(wù)里面的方法泡态。
到這里,兩種方式的區(qū)別已經(jīng)明確了迂卢。
問題來了某弦。
綁定者如何調(diào)用服務(wù)里的方法呢桐汤?
首先定義一個(gè)Service的子類。
publicclassMyServiceextendsService{publicMyService(){? ? }@OverridepublicIBinderonBind(Intent intent){//返回MyBind對(duì)象returnnewMyBinder();? ? }privatevoidmethodInMyService(){? ? ? ? Toast.makeText(getApplicationContext(),"服務(wù)里的方法執(zhí)行了靶壮。怔毛。。",? ? ? ? ? ? ? ? Toast.LENGTH_SHORT).show();? ? }/**
* 該類用于在onBind方法執(zhí)行后返回的對(duì)象腾降,
* 該對(duì)象對(duì)外提供了該服務(wù)里的方法
*/privateclassMyBinderextendsBinderimplementsIMyBinder{@OverridepublicvoidinvokeMethodInMyService(){? ? ? ? ? ? methodInMyService();? ? ? ? }? ? }}
自定義的MyBinder接口用于保護(hù)服務(wù)中不想讓外界訪問的方法拣度。
publicinterfaceIMyBinder{voidinvokeMethodInMyService();}
接著在Manifest.xml文件中配置該Service
在Activity中綁定并調(diào)用服務(wù)里的方法
簡單布局:
綁定服務(wù)的Activity:
publicclassMainActivityextendsActivity{privateMyConn conn;privateIntent intent;privateIMyBinder myBinder;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.activity_main);? ? }//開啟服務(wù)按鈕的點(diǎn)擊事件publicvoidstart(View view){? ? ? ? intent =newIntent(this, MyService.class);? ? ? ? conn =newMyConn();//綁定服務(wù),// 第一個(gè)參數(shù)是intent對(duì)象螃壤,表面開啟的服務(wù)抗果。// 第二個(gè)參數(shù)是綁定服務(wù)的監(jiān)聽器// 第三個(gè)參數(shù)一般為BIND_AUTO_CREATE常量,表示自動(dòng)創(chuàng)建bindbindService(intent, conn, BIND_AUTO_CREATE);? ? }//調(diào)用服務(wù)方法按鈕的點(diǎn)擊事件publicvoidinvoke(View view){? ? ? ? myBinder.invokeMethodInMyService();? ? }privateclassMyConnimplementsServiceConnection{@OverridepublicvoidonServiceConnected(ComponentName componentName, IBinder iBinder){//iBinder為服務(wù)里面onBind()方法返回的對(duì)象奸晴,所以可以強(qiáng)轉(zhuǎn)為IMyBinder類型myBinder = (IMyBinder) iBinder;? ? ? ? }@OverridepublicvoidonServiceDisconnected(ComponentName componentName){? ? ? ? }? ? }}
綁定本地服務(wù)調(diào)用方法的步驟:
在服務(wù)的內(nèi)部創(chuàng)建一個(gè)內(nèi)部類 提供一個(gè)方法窖张,可以間接調(diào)用服務(wù)的方法
實(shí)現(xiàn)服務(wù)的onbind方法,返回的就是這個(gè)內(nèi)部類
在activity 綁定服務(wù)蚁滋。bindService();
在服務(wù)成功綁定的回調(diào)方法onServiceConnected宿接, 會(huì)傳遞過來一個(gè) IBinder對(duì)象
強(qiáng)制類型轉(zhuǎn)化為自定義的接口類型,調(diào)用接口里面的方法辕录。