android 四大組件之--------------Service

淺談service ,歡迎補充。    微笑                                                                    Service《一》

一、簡單介紹

 

Android 的第三大組件----------服務。

不給用戶提供界面。與activity一樣在main線程中執行。把一些耗時操作放在service中的其他線程執(意在處理耗時操作時,在service開闢其他線程來完成操作)。

<繼承關係:

java.lang.Object

   ↳

android.content.Context

 

   ↳

android.content.ContextWrapper

 

 

   ↳

 

android.app.Service

 

 

 

 

 

<兩種service啓動的生命週期圖:

 

注:上圖中onStartCommand()方法 即可理解爲onstart()方法。

解釋:

1、onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()bindService()方法,服務也只被創建一次。onDestroy()該方法在服務被終止時調用。 

2. Context.startService()啓動Service的生命週期

方法onStart() 只有採用Context.startService()方法啓動服務時纔會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法儘管不會多次創建服務,但onStart() 方法會被多次調用。
3. Context.bindService()啓動Service生命週期

方法onBind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。onUnbind()只有採用Context.bindService()方法啓動服務時纔會回調該方法。該方法在調用者與服務解除綁定時被調用。

 

二、具體實現:

第一步:自定義一個類繼承自service

第二步:重寫需要重寫的方法

第三步:根據不同的啓動方式,定義不同的參數。

第四步:調用服務

兩種啓動方式Context.startService() and Context.bindService().

<> startServiceintent

調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。

1使用context.startService()啓動該服務

服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調onStart()方法。

2採用Context.stopService()方法或者是Service.stopSelf()結束服務,服務結束時會調用onDestroy()方法

 

 

<> bindserviceintentserviceconnectionflags

Serviceconnection關於這個參數,作如下解釋:

顧名思義----服務連接。是在服務與綁定者之間連接作用。是一個接口,內有兩個抽象方法

Summary

Public Methods

abstract void

onServiceConnected(ComponentName name, IBinder service)

Called when a connection to the Service has been established, with 

the IBinder of the communication channel to the Service.

abstract void

onServiceDisconnected(ComponentName name)

Called when a connection to the Service has been lost.

 

 

注:鏈接可以反覆建立,並且永遠是最新的一個連接。就是說可以new好多,但最新的一個起作用。

 

調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。

1、使用context.bindService()啓動服務

在服務未被創建時,系統會先調用服務的onCreate()方法,接着調用onBind()方法。這個時候調用者和服務綁定在一起。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()onBind()方法並不會被多次調用)多個客戶端可以綁定至同一個服務

2、使用unbindService()停止服務或直接退出停止服務。

調用者退出了,系統就會先調用服務的onUnbind()方法,接着調用onDestroy()方法。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。

注:當activity finish時 ,那麼與他綁定的service會自動onunbind()、  ondestroy()

 

 

三、啓動方式的選擇;

沒有嚴格的界限,需要在開發過程中尋找。

 

附註:需要說明的幾點:

官方文檔告訴我們,一個service可以同時start並且bind,在這樣的情況,系統會一直保持service的運行狀態如果service已經start了或者BIND_AUTO_CREATE標誌被設置。如果沒有一個條件滿足,那麼系統將會調用onDestory方法來終止service.所有的清理工作(終止線程,反註冊接收器)都在onDestory中完成。

擁有service的進程具有較高的優先級

    官方文檔告訴我們,Android系統會盡量保持擁有service的進程運行,只要在該service已經被啓動(start)或者客戶端連接(bindService)到它。當內存不足時,需要保持,擁有service的進程具有較高的優先級。

 

1. 如果service正在調用onCreate,onStartCommand或者onDestory方法,那麼用於

當前service的進程則變爲前臺進程以避免被killed。
2. 如果當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,

但是比那些不可見的進程更重要,這就意味着service一般不會被killed.
3. 如果客戶端已經連接到service (bindService),那麼擁有Service的進程則擁有最高的優先級,

可以認爲service是可見的。
4. 如果service可以使用startForeground(int, Notification)方法來將service設置爲前臺狀態,

那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。

在 AndroidManifest.xml 裏 Service 元素的常見選項

android:name  -------------  服務類名

android:label  --------------  服務的名字,如果此項不設置,那麼默認顯示的服務名則爲類名

android:icon  --------------  服務的圖標

android:permission  -------  申明此服務的權限,這意味着只有提供了該權限的應用才能控制或連接此服務

android:process  ----------  表示該服務是否運行在另外一個進程,如果設置了此項,那麼將會在包名後面加上這段字符串表示另一進程的名字

android:enabled  ----------  如果此項設置爲 true,那麼 Service 將會默認被系統啓動,不設置默認此項爲 false

android:exported  ---------  表示該服務是否能夠被其他應用程序所控制或連接,不設置默認此項爲 false


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章