1. 程式人生 > >Service生命週期解析及啟動Service的方法

Service生命週期解析及啟動Service的方法

生命週期解析

這裡寫圖片描述

好的,從上圖的生命週期,我們可以知道,Android中使用Service的方式有兩種:
  • 1)StartService()啟動Service
  • 2)BindService()啟動Service
  • PS:還有一種,就是啟動Service後,繫結Service!

1)相關方法詳解:

  • onCreate():當Service第一次被建立後立即回撥該方法,該方法在整個生命週期 中只會呼叫依次!
  • onDestory():當Service被關閉時會回撥該方法,該方法只會回撥一次!
  • onStartCommand(intent,flag,startId):早期版本是onStart(intent,startId), 當客戶端呼叫startService(Intent)方法時會回撥,可多次呼叫StartService方法, 但不會再建立新的Service物件,而是繼續複用前面產生的Service物件,但會繼續回撥 onStartCommand()方法!
  • IBinder onOnbind(intent):該方法是Service都必須實現的方法,該方法會返回一個 IBinder物件,app通過該物件與Service元件進行通訊!
  • onUnbind(intent):當該Service上繫結的所有客戶端都斷開時會回撥該方法

2)StartService啟動Service

①首次啟動會建立一個Service例項,依次呼叫onCreate()和onStartCommand()方法,此時Service 進入執行狀態,如果再次呼叫StartService啟動Service,將不會再建立新的Service物件, 系統會直接複用前面建立的Service物件,呼叫它的onStartCommand()方法!
②但這樣的Service與它的呼叫者無必然的聯絡,就是說當呼叫者結束了自己的生命週期, 但是隻要不呼叫stopService,那麼Service還是會繼續執行的!
③無論啟動了多少次Service,只需呼叫一次StopService即可停掉Service

3)BindService啟動Service

①當首次使用bindService繫結一個Service時,系統會例項化一個Service例項,並呼叫其onCreate()和onBind()方法,然後呼叫者就可以通過IBinder和Service進行互動了,此後如果再次使用bindService繫結Service,系統不會建立新的Sevice例項,也不會再呼叫onBind()方法,只會直接把IBinder物件傳遞給其他後來增加的客戶端!
②如果我們解除與服務的繫結,只需呼叫unbindService(),此時onUnbind和onDestory方法將會被呼叫!這是一個客戶端的情況,假如是多個客戶端繫結同一個Service的話,情況如下 當一個客戶完成和service之間的互動後,它呼叫 unbindService() 方法來解除繫結。當所有的客戶端都和service解除繫結後,系統會銷燬service。(除非service也被startService()方法開啟)
③另外,和上面那張情況不同,bindService模式下的Service是與呼叫者相互關聯的,可以理解為 “一條繩子上的螞蚱”,要死一起死,在bindService後,一旦呼叫者銷燬,那麼Service也立即終止!
通過BindService呼叫Service時呼叫的Context的bindService的解析 bindService(Intent Service,ServiceConnection conn,int flags)
service:通過該intent指定要啟動的Service
conn:ServiceConnection物件,使用者監聽訪問者與Service間的連線情況, 連線成功回撥該物件中的onServiceConnected(ComponentName,IBinder)方法; 如果Service所在的宿主由於異常終止或者其他原因終止,導致Service與訪問者間斷開 連線時呼叫onServiceDisconnected(CompanentName)方法,主動通過unBindService() 方法斷開並不會呼叫上述方法!
flags:指定繫結時是否自動建立Service(如果Service還未建立), 引數可以是0(不自動建立),BIND_AUTO_CREATE(自動建立)

4)StartService啟動Service後bindService繫結

如果Service已經由某個客戶端通過StartService()啟動,接下來由其他客戶端 再呼叫bindService()繫結到該Service後呼叫unbindService()解除繫結最後在 呼叫bindService()繫結到Service的話,此時所觸發的生命週期方法如下:
onCreate( )->onStartCommand( )->onBind( )->onUnbind( )->onRebind( )
PS:前提是:onUnbind()方法返回true!!! 這裡或許部分讀者有疑惑了,呼叫了unbindService後Service不是應該呼叫 onDistory()方法麼!其實這是因為這個Service是由我們的StartService來啟動的 ,所以你呼叫onUnbind()方法取消繫結,Service也是不會終止的!
得出的結論: 假如我們使用bindService來繫結一個啟動的Service,注意是已經啟動的Service!!! 系統只是將Service的內部IBinder物件傳遞給Activity,並不會將Service的生命週期 與Activity繫結,因此呼叫unBindService( )方法取消繫結時,Service也不會被銷燬!

相關推薦

Service生命週期解析啟動Service方法

生命週期解析 好的,從上圖的生命週期,我們可以知道,Android中使用Service的方式有兩種: 1)StartService()啟動Service 2)BindService()啟動Service PS:還有一種,就是啟動Service後,繫

Service生命週期最全面解析

前言 Service作為Android四大元件之一,應用非常廣泛本文將介紹Service最基礎的知識:Service的生命週期  目錄 1. 生命週期常用方法 在Service的生命週

Android Service生命週期淺析

Service 作為 Android四大元件之一,應用非常廣泛。和Activity一樣,Service 也有一系列的生命週期回撥函式,我們可以用來監測 Service狀態變化,並且在適當的時候執行適當的工作。 Service生命週期圖 1. 生命週期狀態 Service生命週期流程

Android-Service生命週期

MyService重寫的方法: public class MyService extends Service { private final static String TAG = MyService.class.getSimpleName(); @Override pub

除錯windows service的OnStart事件除錯service的一些方法彙總

雖然 MSDN 的 HOW TO:偵錯 Windows 服務應用程式 檔案有教如何除錯,但是這樣的除錯有個大缺點,就是有時後程式碼是在 OnStart 事件一開始的時候就發生問題的,有時後就會因為來不及 附加 (Attach) 程式導致無法除錯。另外,對於「安裝專案」內的「自訂動作」由於是在專案的 Insta

Activity,Service生命週期

Service生命週期一般有兩種使用方式Service可以被啟動或者允許被啟動直到有人停止了它或者它自己停止了。在這種模式下,它通過Context.startService()方法開始,通過Context.stopService()方法停止。它可以通過Service.stop

Android service 生命週期

public class ExampleService extends Service { int mStartMode; // indicates how to behave if the service is killed IBinder mBinder; // interface f

安卓Service生命週期,你應該知道的都在這裡

如有轉載,請申明: Service是安卓的四大元件之一。它是一個沒有介面的元件,且優先順序大於後臺程序。 瞭解它的生命週期很有必要。 Service啟動的分類 啟動服務: 通過startService啟動的服務稱為啟動服務 繫結啟動服務: 通過bindSe

安卓Activity和Service生命週期

----------------------------------------------------------------------------------------------------------------------------------------

Service生命週期詳解

Service四大組織之一 需要在清單檔案裡註冊 <service android:name=".My_Serve"> <intent-filter> <action android:name="my_menu_

Service 生命週期

先看一段程式碼在LogCat中新增一個標籤,觀察Service生命週期的過程。 import android.app.Service;import android.content.Intent;import android.os.IBinder;import androi

Android Service生命週期理解

Android  有兩種啟動模式 1、bindService() 2、startService() startService生命週期 oncreate-->onstart-->onstartcommand--> service runing--->

Android Activity生命周期啟動模式

但是 判斷 撥打 開發 文件中 設備 相關 不可 des   曾經搞過許多東西,再熟練的東西一段時間沒有碰都會生疏或忘記。後來體會到寫成文檔記錄下來的重要性,但有些word或ppt記錄下來的東西隨著時間流逝會丟失,或者不願去看。或許保存成博客的形式,會是更好的選擇,勉勵自己

Android的activity的生命週期解析

Android官方文件和其他不少資料都對Activity生命週期進行了詳細介紹,在結合資料和專案開發過程中遇到的問題,本文將對Activity生命週期進行一次總結。 Activity是由Activity棧進管理,當來到一個新的Activity後,此Activity將被加入到Activit

spring中baen的生命週期生命週期中的作用

最近在看spring原始碼,所以總結下spring的生命週期和各個階段的作用。 spring的生命週期概括起來主要如下: 例項化 屬性注入 ioc注入 實現了BeanNameAware 則執行setBeanName方法  實現了BeanFactoryAw

VUE的生命週期解析

VUE的生命週期解析 生命鉤子意義 就是在描述這個 Vue 例項的過程 其實鉤子就是在 不同時期執行的回撥函式 本意就是在 Vue 中給我們提供一個寫程式碼的地方 VUE的生命週期 beforeCreate 在例項建立之

Android--測試Activity的生命週期事件及其回撥方法

//activity_main.xml <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="h

Fragment生命週期(在不同的方法分別能做什麼操作)

在使用fragment時首先要知道fragment的生命週期,我們能在生命週期方法中做什麼操作 onAttch(Activity activity):這個方法是在fragment與activity關聯

服務 Service 簡介 啟動方式 生命週期 案例

Markdown版本筆記 我的GitHub首頁 我的部落格 我的微信 我的郵箱 MyAndroidBlogs baiqiantao bai

JavaScript是如何工作的:Service Worker的生命週期使用場景

摘要: 理解Service Worker。 原文:JavaScript 是如何工作的:Service Worker 的生命週期及使用場景 作者:前端小智 Fundebug經授權轉載,版權歸原作者所有。 這是專門探索 JavaScript 及其所構建的元件的系列