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
public
int
onstartcommand(intent intent,
int
flags,
int
startid)
或?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@override
public
int
onstartcommand(intent intent,
int
flags,
int
startid)
@override
public
void
onstart(intent intent,
int
startid)
2.在service的ondestroy()中重啟service.?
12
3
4
5
6
public
void
ondestroy()
3.建立乙個廣播?
12
3
4
5
6
7
8
public
class
myreceiver
extends
broadcastreceiver
}
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 非常明顯,這裡是和...