Service是android 系統中的一種元件

2021-08-10 19:53:34 字數 3919 閱讀 3361

service是android 系統中的一種元件,它跟activity的級別差不多,但是他不能自己執行,只能後台執行,並且可以和其他元件進行互動。

android開發的過程中,每次呼叫startservice(intent)的時候,都會呼叫該service物件的onstartcommand(intent,int,int)方法,然後在onstartcommand方法中做一些處理。

從android官方文件中,我們知道onstartcommand有4種int返回值,首先簡單地講講int返回值的作用。

一、onstartcommand有4種返回值:

start_sticky:如果service程序被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent物件。隨後系統會嘗試重新建立service,由於服務狀態為開始狀態,所以建立服務後一定會呼叫onstartcommand(intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼引數intent將為null。

start_not_sticky:「非粘性的」。使用這個返回值時,如果在執行完onstartcommand後,服務被異常kill掉,系統不會自動重啟該服務。

start_redeliver_intent:重傳intent。使用這個返回值時,如果在執行完onstartcommand後,服務被異常kill掉,系統會自動重啟該服務,並將intent的值傳入。

start_sticky_compatibility:start_sticky的相容版本,但不保證服務被kill後一定能重啟。

二、建立不被殺死的service

1.在service中重寫下面的方法,這個方法有三個返回值, start_sticky(或start_sticky_compatibility)是service被kill掉後自動重寫建立

?

1

2

3

4

5

6

@override

publicintonstartcommand(intent intent,intflags,intstartid)

或?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@override

publicintonstartcommand(intent intent,intflags,intstartid)

@override

publicvoidonstart(intent intent,intstartid)

2.在service的ondestroy()中重啟service.?

12

3

4

5

6

publicvoidondestroy()

3.建立乙個廣播?

12

3

4

5

6

7

8

publicclassmyreceiverextendsbroadcastreceiver

}

4.androidmanifest.xml中註冊廣播myreceiver及myservice服務?

12

3

4

5

6

7

8

9

10

11

注:解鎖,啟動,切換場景啟用廣播需加許可權,如啟動完成,及手機機狀態等。 ?

12

kill問題:

1. settings 中stop service

ondestroy方法中,呼叫startservice進行service的重啟。

2.settings中force stop 應用

捕捉系統進行廣播(action為android.intent.action.package_restarted)

3. 借助第三方應用kill掉running task

?

1

2

3

4

5

6

android:persistent="true"

android:label="@string/dialericonlabel"

android:icon="@drawable/ic_launcher_phone">

...

android 除錯命令service

在android中,可以利用service命令去做很多除錯工作,例如service list命令顯示系統當前所有在service manager註冊的service,其命令具體使用如下,service service usage service h service list service chec...

android開機啟動service

1 首先建立乙個廣播接收者,重構其抽象方法 onreceive context context,intent intent 在其中啟動你想要啟動的service。import android.content.broadcastreceiver import android.content.conte...

Android中Service和Thread的區別

rlei 把service等同於thread或process是乙個非常常見的誤解。需要 強調又強調 的第一點是,android的service是乙個context,並不必然等於乙個額外的thread 裡面專門強調 為什麼強調說 longer running 的 component 非常明顯,這裡是和...