1. 程式人生 > >android service startService與bindService的區別

android service startService與bindService的區別

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

1、生命週期上的區別

    執行startService時,Service會經歷onCreate->onStartCommand。當執行stopService時,直接呼叫onDestroy方法。呼叫者如果沒有stopService,Service會一直在後臺執行,下次呼叫者再起來仍然可以stopService。

    執行bindService時,Service會經歷onCreate->onBind。這個時候呼叫者和Service繫結在一起。呼叫者呼叫unbindService方法或者呼叫者Context不存在了(如Activity被finish了),Service就會呼叫onUnbind->onDestroy。這裡所謂的繫結在一起就是說兩者共存亡了。

    多次呼叫startService,該Service只能被建立一次,即該Service的onCreate方法只會被呼叫一次。但是每次呼叫startService,onStartCommand方法都會被呼叫。Service的onStart方法在API 5時被廢棄,替代它的是onStartCommand方法。

    第一次執行bindService時,onCreate和onBind方法會被呼叫,但是多次執行bindService時,onCreate和onBind方法並不會被多次呼叫,即並不會多次建立服務和繫結服務。

2、呼叫者如何獲取繫結後的Service的方法

    onBind回撥方法將返回給客戶端一個IBinder介面例項,IBinder允許客戶端回撥服務的方法,比如得到Service執行的狀態或其他操作。我們需要IBinder物件返回具體的Service物件才能操作,所以說具體的Service物件必須首先實現Binder物件。

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

    如果一個Service又被啟動又被繫結,則該Service會一直在後臺執行。首先不管如何呼叫,onCreate始終只會呼叫一次。對應startService呼叫多少次,Service的onStart方法便會呼叫多少次。Service的終止,需要unbindService和stopService同時呼叫才行。不管startService與bindService的呼叫順序,如果先呼叫unbindService,此時服務不會自動終止,再呼叫stopService之後,服務才會終止;如果先呼叫stopService,此時服務也不會終止,而再呼叫unbindService或者之前呼叫bindService的Context不存在了(如Activity被finish的時候)之後,服務才會自動停止。

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

    如果你只是想要啟動一個後臺服務長期進行某項任務,那麼使用startService便可以了。如果你還想要與正在執行的Service取得聯絡,那麼有兩種方法:一種是使用broadcast,另一種是使用bindService。前者的缺點是如果交流較為頻繁,容易造成效能上的問題,而後者則沒有這些問題。因此,這種情況就需要startService和bindService一起使用了。

    另外,如果你的服務只是公開一個遠端介面,供連線上的客戶端(Android的Service是C/S架構)遠端呼叫執行方法,這個時候你可以不讓服務一開始就執行,而只是bindService,這樣在第一次bindService的時候才會建立服務的例項執行它,這會節約很多系統資源,特別是如果你的服務是遠端服務,那麼效果會越明顯(當然在Servcie建立的是偶會花去一定時間,這點需要注意)。    

4、本地服務與遠端服務

    本地服務依附在主程序上,在一定程度上節約了資源。本地服務因為是在同一程序,因此不需要IPC,也不需要AIDL。相應bindService會方便很多。缺點是主程序被kill後,服務變會終止。

    遠端服務是獨立的程序,對應程序名格式為所在包名加上你指定的android:process字串。由於是獨立的程序,因此在Activity所在程序被kill的是偶,該服務依然在執行。缺點是該服務是獨立的程序,會佔用一定資源,並且使用AIDL進行IPC稍微麻煩一點。

    對於startService來說,不管是本地服務還是遠端服務,我們需要做的工作都一樣簡單。

5、程式碼例項

    startService啟動服務

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public class LocalService1 extends Service { /** * onBind 是 Service 的虛方法,因此我們不得不實現它。 * 返回 null,表示客服端不能建立到此服務的連線。 */ @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public void onStartCommand(Intent intent, int startId, int flags) { super.onStartCommand(intent, startId, flags); } @Override public void onDestroy() {

相關推薦

android service startServicebindService區別

Android執行Service有兩種方法,一種是startService,一種是bindService。下面讓我們一起來聊一聊這兩種執行Service方法的區別。 1、生命週期上的區別     執行startService時,Service會經歷

Android筆記-service啟動過程分析:bindService原始碼分析、startServicebindService區別

前言: Service的啟動流程將會分為一個系列來講述。 本系列開始將分析Service的啟動過程。 看這個系列文章之前你所需要知道的知識點: 1. 熟悉service的基本用法。 2. 瞭解bind機制,知道android的客戶端和AMS間通

Android Service 服務 三 bindServiceremoteService

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

startServicebindService區別

Android執行Service有兩種方法,一種是startService,一種是bindService。下面讓我們一起來聊一聊這兩種執行Service方法的區別。 1、生命週期上的區別 執行startService時,Service會經歷onCre

有關ServicestartServicebindService在各種情形下生命週期的變化

Activity模版: public class MainActivity extends AppCompatActivity{ private ServiceConnection connection=new ServiceConnection

AndroidstartService()和bindService()的區別

1. startService和bindService關係? 服務不能自己執行。一旦Activity中呼叫了startService()方法啟動Service後,Activity就不能直接控制Service了。這時就需要bindService()把

AndroidstartServicebindService混合使用總結

先自定義一個service: public class MyService extends Service { private Service startService; private Service bindService; @Nullable

深入理解Androidstartservicebindservice

一、首先,讓我們確認下什麼是service?          service就是android系統中的服務,它有這麼幾個特點:它無法與使用者直接進行互動、它必須由使用者或者其他程式顯式的啟動、它的優先順序比較高,它比處於前臺的應用優先順序低,但是比後臺的其他應用優先順序高,

Android Service和Thread的區別

Service既不是程序也不是執行緒,它們之間的關係如下:       可能有的朋友會問了,既然是長耗時的操作,那麼Thread也可以完成啊。沒錯,在程式裡面很多耗時工作我們也可以通過Thread來完成,那麼還需要Service幹嘛呢。接下來就為大家解釋以下Serv

[Java][Android][Process] ProcessBuilderRuntime區別

在Android中想要進行Ping,在不Root機器的情況下似乎還只能進行底層命呼叫才能實現。 因為在Java中要進行ICMP包傳送需要Root許可權。 於是只能通過建立程序來解決了,建立程序在Java中有兩種方式,分別為: 1. 呼叫ProcessBuilder的建構函

轉:Android中IntentServiceService區別

https://blog.csdn.net/matrix_xu/article/details/7974393 Android中的Service是用於後臺服務的,當應用程式被掛到後臺的時候,問了保證應用某些元件仍然可以工作而引入了Service這個概念,那麼這裡面要強調的是Service不是獨立

Service元件(startService,stopService,bindService,unbindService方法比較)-Android

   Service是執行在主執行緒中的.如果需要執行非同步操作,可以考慮IntentServcie。Service比Activity具有更高的優先順序,只有在系統資源極度匱乏的情況下,android系統才可能清理掉一部分service來保證系統的執行,而這種情況卻又輕易不

Android 版本控制工具SVNGIT 區別, Git使用詳情

為什麼要用版本控制工具? 多人協作開發 方便程式碼統一管理 常用的版本控制工具有哪些? CVS, SVN, GIT GIT 和 SVN 的區別 Git 是目前世界上最先進的分散式版本控制系統 SVN 是集中式的管理工具 1.版本庫是集中放在中央伺服器的,而幹活的時

Android MVPMVC區別

1、MVP與MVC的區別 Activity職責不同,Activity在MVP中是View層,在MVC中是Controller層,這是MVC和MVP很主要的一個區別,可以說Android從MVC轉向MVP開發也主要是優化Activity的程式碼,避免Activity的程式碼臃腫龐大。

android dp sp px的區別聯絡

畫素密度? 螢幕的畫素密度在不同的手機上是不盡相同的。所以需要建立一個獨立於畫素系統的單位來適應不同平臺的手機。 如何計算畫素密度? pixel density = width(or height) in pixels / width(or height)

Gradle、Gradle WrapperAndroid Plugin for Gradle的區別和聯絡

原文連結:https://www.cnblogs.com/jiangxinnju/p/8229129.html 總結: Gradle:是一個專案構建系統,類似於Maven。Gradle並不是只能用於Android,而是Android引用裡Gradle。https://docs.gradle.

Android ServiceActivity的互動

Android中有時候需要在Service中改變Activity的UI,或者在Activity中修改Service中的數值。首先必須使用與Activity繫結的Service,有三種方式可以實現。第一,是使用介面回撥的方式在Activty中實現Service中的介面;第二,使用廣播的方式傳遞;第三,則是用觀察

Android ServiceActivity的交互

create ces per andro 時機 子線程 lse tag ins Android中有時候需要在Service中改變Activity的UI,或者在Activity中修改Service中的數值。首先必須使用與Activity綁定的Service,有三種方式可以實現

徹底搞懂Gradle、Gradle WrapperAndroid Plugin for Gradle的區別和聯絡

歡迎和大家交流技術相關問題: 郵箱: [email protected] 部落格園地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://github.com/jiangxincode 知乎地址: https://www.zhihu.com/

【6】 android 服務的應用 startServicebindService

最基本的應用那就開啟和關閉了 我們這裡寫一個demo 並講解一下兩個開啟(StartService,BindService)有什麼區別 package com.zy.servicesdemo; import android.content.ComponentName;