日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android之startService与bindService的区别

發(fā)布時(shí)間:2023/12/4 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之startService与bindService的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Android執(zhí)行Service有兩種方法,一種是startService,一種是bindService。下面讓我們一起來聊一聊這兩種執(zhí)行Service方法的區(qū)別。

1、生命周期上的區(qū)別

????執(zhí)行startService時(shí),Service會(huì)經(jīng)歷onCreate->onStartCommand。當(dāng)執(zhí)行stopService時(shí),直接調(diào)用onDestroy方法。調(diào)用者如果沒有stopService,Service會(huì)一直在后臺(tái)運(yùn)行,下次調(diào)用者再起來仍然可以stopService。

????執(zhí)行bindService時(shí),Service會(huì)經(jīng)歷onCreate->onBind。這個(gè)時(shí)候調(diào)用者和Service綁定在一起。調(diào)用者調(diào)用unbindService方法或者調(diào)用者Context不存在了(如Activity被finish了),Service就會(huì)調(diào)用onUnbind->onDestroy。這里所謂的綁定在一起就是說兩者共存亡了。

????多次調(diào)用startService,該Service只能被創(chuàng)建一次,即該Service的onCreate方法只會(huì)被調(diào)用一次。但是每次調(diào)用startService,onStartCommand方法都會(huì)被調(diào)用。Service的onStart方法在API 5時(shí)被廢棄,替代它的是onStartCommand方法。

????第一次執(zhí)行bindService時(shí),onCreate和onBind方法會(huì)被調(diào)用,但是多次執(zhí)行bindService時(shí),onCreate和onBind方法并不會(huì)被多次調(diào)用,即并不會(huì)多次創(chuàng)建服務(wù)和綁定服務(wù)。

2、調(diào)用者如何獲取綁定后的Service的方法

????onBind回調(diào)方法將返回給客戶端一個(gè)IBinder接口實(shí)例,IBinder允許客戶端回調(diào)服務(wù)的方法,比如得到Service運(yùn)行的狀態(tài)或其他操作。我們需要IBinder對(duì)象返回具體的Service對(duì)象才能操作,所以說具體的Service對(duì)象必須首先實(shí)現(xiàn)Binder對(duì)象。

3、既使用startService又使用bindService的情況

????如果一個(gè)Service又被啟動(dòng)又被綁定,則該Service會(huì)一直在后臺(tái)運(yùn)行。首先不管如何調(diào)用,onCreate始終只會(huì)調(diào)用一次。對(duì)應(yīng)startService調(diào)用多少次,Service的onStart方法便會(huì)調(diào)用多少次。Service的終止,需要unbindService和stopService同時(shí)調(diào)用才行。不管startService與bindService的調(diào)用順序,如果先調(diào)用unbindService,此時(shí)服務(wù)不會(huì)自動(dòng)終止,再調(diào)用stopService之后,服務(wù)才會(huì)終止;如果先調(diào)用stopService,此時(shí)服務(wù)也不會(huì)終止,而再調(diào)用unbindService或者之前調(diào)用bindService的Context不存在了(如Activity被finish的時(shí)候)之后,服務(wù)才會(huì)自動(dòng)停止。

????那么,什么情況下既使用startService,又使用bindService呢?

????如果你只是想要啟動(dòng)一個(gè)后臺(tái)服務(wù)長(zhǎng)期進(jìn)行某項(xiàng)任務(wù),那么使用startService便可以了。如果你還想要與正在運(yùn)行的Service取得聯(lián)系,那么有兩種方法:一種是使用broadcast,另一種是使用bindService。前者的缺點(diǎn)是如果交流較為頻繁,容易造成性能上的問題,而后者則沒有這些問題。因此,這種情況就需要startService和bindService一起使用了。

????另外,如果你的服務(wù)只是公開一個(gè)遠(yuǎn)程接口,供連接上的客戶端(Android的Service是C/S架構(gòu))遠(yuǎn)程調(diào)用執(zhí)行方法,這個(gè)時(shí)候你可以不讓服務(wù)一開始就運(yùn)行,而只是bindService,這樣在第一次bindService的時(shí)候才會(huì)創(chuàng)建服務(wù)的實(shí)例運(yùn)行它,這會(huì)節(jié)約很多系統(tǒng)資源,特別是如果你的服務(wù)是遠(yuǎn)程服務(wù),那么效果會(huì)越明顯(當(dāng)然在Servcie創(chuàng)建的是偶會(huì)花去一定時(shí)間,這點(diǎn)需要注意)。? ??

4、本地服務(wù)與遠(yuǎn)程服務(wù)

????本地服務(wù)依附在主進(jìn)程上,在一定程度上節(jié)約了資源。本地服務(wù)因?yàn)槭窃谕贿M(jìn)程,因此不需要IPC,也不需要AIDL。相應(yīng)bindService會(huì)方便很多。缺點(diǎn)是主進(jìn)程被kill后,服務(wù)變會(huì)終止。

????遠(yuǎn)程服務(wù)是獨(dú)立的進(jìn)程,對(duì)應(yīng)進(jìn)程名格式為所在包名加上你指定的android:process字符串。由于是獨(dú)立的進(jìn)程,因此在Activity所在進(jìn)程被kill的是偶,該服務(wù)依然在運(yùn)行。缺點(diǎn)是該服務(wù)是獨(dú)立的進(jìn)程,會(huì)占用一定資源,并且使用AIDL進(jìn)行IPC稍微麻煩一點(diǎn)。

????對(duì)于startService來說,不管是本地服務(wù)還是遠(yuǎn)程服務(wù),我們需要做的工作都一樣簡(jiǎn)單。

5、代碼實(shí)例

????startService啟動(dòng)服務(wù)

public class LocalService1 extends Service {/*** onBind 是 Service 的虛方法,因此我們不得不實(shí)現(xiàn)它。* 返回 null,表示客服端不能建立到此服務(wù)的連接。*/@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic void onStartCommand(Intent intent, int startId, int flags) {super.onStartCommand(intent, startId, flags);}@Overridepublic void onDestroy() {super.onDestroy();} }
?bindService綁定服務(wù)

public class LocalService extends Service { /** * 在 Local Service 中我們直接繼承 Binder 而不是 IBinder,因?yàn)?Binder 實(shí)現(xiàn)了 IBinder 接口,這樣我們可以** 少做很多工作。 */ public class SimpleBinder extends Binder{ /** * 獲取 Service 實(shí)例 * @return */ public LocalService getService(){ return LocalService.this; }public int add(int a, int b){ return a + b; } }public SimpleBinder sBinder;@Override public void onCreate() { super.onCreate(); // 創(chuàng)建 SimpleBinder sBinder = new SimpleBinder(); }@Override public IBinder onBind(Intent intent) { // 返回 SimpleBinder 對(duì)象 return sBinder; } }
? 上面的代碼關(guān)鍵之處,在于 onBind(Intent) 這個(gè)方法 返回了一個(gè)實(shí)現(xiàn)了 IBinder?接口的對(duì)象,這個(gè)對(duì)象將用于綁定Service 的 Activity 與 Local Service 通信。

????下面是 Activity 中的代碼:

public class Main extends Activity {private final static String TAG = "SERVICE_TEST";private ServiceConnection sc;private boolean isBind;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);sc = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {LocalService.SimpleBinder sBinder = (LocalService.SimpleBinder)service;Log.v(TAG, "3 + 5 = " + sBinder.add(3, 5));Log.v(TAG, sBinder.getService().toString());}};findViewById(R.id.btnBind).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {bindService(new Intent(Main.this, LocalService.class), sc, Context.BIND_AUTO_CREATE);isBind = true;}});findViewById(R.id.btnUnbind).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(isBind){unbindService(sc);isBind = false;}}});} }

6、在AndroidManifest.xml里Service元素常見選項(xiàng) ?

????android:name  -------------  服務(wù)類名

????android:label  --------------  服務(wù)的名字,如果此項(xiàng)不設(shè)置,那么默認(rèn)顯示的服務(wù)名則為類名

????android:icon  --------------  服務(wù)的圖標(biāo)

????android:permission  -------  申明此服務(wù)的權(quán)限,這意味著只有提供了該權(quán)限的應(yīng)用才能控制或連接此服務(wù)

????android:process  ----------  表示該服務(wù)是否運(yùn)行在另外一個(gè)進(jìn)程,如果設(shè)置了此項(xiàng),那么將會(huì)在包名后面加上這段字符串表示另一進(jìn)程的名字

????android:enabled  ----------  表示是否能被系統(tǒng)實(shí)例化,為true表示可以,為false表示不可以,默認(rèn)為true

????android:exported  ---------  表示該服務(wù)是否能夠被其他應(yīng)用程序所控制或連接,不設(shè)置默認(rèn)此項(xiàng)為 false


總結(jié)

以上是生活随笔為你收集整理的Android之startService与bindService的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。