Service是Android系統中運行在后臺、不和用戶交互利用組件。它和Activity的級別差不多,只能在后臺運行。每一個Service必須在manifest文件中 通過<service>來聲明。
Service的生命周期其實不像Activity那末復雜,它只繼承了onCreate(),onStart(),onDestroy()3個方法,當我們第1次啟動Service的時候,前后調用onCreate()、onStart()這兩個方法,當停止Service的時候,則履行onDestroy()方法,這里需要注意的是,如果Service已啟動了,當我們再次啟動Service時,不會再履行onCreate()方法,而是直接履行onStart()方法。Service的啟動有StartService和BindService兩種方法,這兩種方法對Service生命周期的影響是不1樣的。
下面,我們分別來看看這兩種方法是如何影響Service生命周期的:
1) StartService啟動Service
用這類方法啟動Service,Service會經歷 onCreate 然后是onStart,接著1直處于運行狀態,直到stopService的時候調用onDestroy方法。如果是調用者自己直接退出而沒有調用stopService的話,Service會1直在后臺運行。
2) BindService啟動Service
通過這類方法啟動Service,Service會運行onCreate,然后是調用onBind, 這個時候調用者和Service綁定在1起。調用者退出了,Srevice就會調用onUnbind->onDestroyed方法。所謂綁定在1起就共存亡了。調用者也能夠通過調用unbindService方法來停止服務,這時候候Srevice就會調用onUnbindonUnbind->onDestroyed方法。
我們已對Service的生命周期有了1定的了解,Service的啟動方式不同,它的生命周期也不相同。下面,就讓我們來看看Service究竟是如何啟動和停止的。
服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用處合有所不同。
1)使用startService()方法啟用服務,調用者與服務之間沒有關連,即便調用者退出了,服務依然運行。
如果打算采取Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。
如果調用startService()方法前服務已被創建,屢次調用startService()方法其實不會致使屢次創建服務,但會致使屢次調用onStart()方法。
采取startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
2)使用bindService()方法啟用服務,調用者與服務綁定在了1起,調用者1旦退出,服務也就終止,大有“不求同生,必須同死”的特點。
onBind()只有采取Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已綁定,屢次調用Context.bindService()方法其實不會致使該方法被屢次調用。
采取Context.bindService()方法啟動服務時只能調用onUnbind()方法消除調用者與服務消除,服務結束時會調用onDestroy()方法。
本地服務用于利用程序內部。它可以啟動并運行,直到有人停止了它或它自己停止。在這類方式下,它以調用Context.startService()來啟動,調用Context.stopService()來停止。它也能夠調用Service.stopSelf() 或Service.stopSelfResult()來自己停止。不論調用了多少次startService()方法,你只需要調用1次stopService()就能夠停止服務。
它用于實現利用程序自己的1些耗時任務,比如查詢升級信息,它其實不占用利用程序Activity所屬線程,而只是單開線程后臺履行,這樣用戶體驗比較好。
有些服務是不需要和Activity交互就可以直接運行的,而有些則是需要與Activity進行交互。下面,我們通過1些例子來加以說明。
1)不和Activity交互的本地服務
首先,我們新建1個LocalService類繼承自Service,代碼以下:
// import略 public class LocalService extends Service{
@Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); } } |
然后,新建1個類ServiceActivity繼承自Actvity,代碼以下:
// import略 public class ServiceActivity extends Activity{
private Button startBtn,stopBtn;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.localservice); startBtn = (Button)findViewById(R.id.start_button); stopBtn = (Button)findViewById(R.id.stop_button); startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(new Intent("com.char4.LOCAL_SERVICE")); } }); stopBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(new Intent("com.char4.LOCAL_SERVICE")); } }); }
} |
布局文件localservice.xml代碼以下,它定義了兩個按鈕,1個用來啟動Service,1個用來停止Service:
<?xml version="1.0" encoding="utf⑻"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:id="@+id/start_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="啟動"/> <Button android:id="@+id/stop_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="停止"/> </LinearLayout> |
別忘了,在AndroidMainfest.xml中注冊Service:
<service android:name=".LocalService"> <intent-filter> <action android:name="com.char4.LOCAL_SERVICE " /> <category android:name="android.intent.category.default" /> </intent-filter> </service> |
下面,我們來看看效果,如圖4⑺所示:
圖4⑺ startService啟動順序
通過日志打印我們可以發現,第1次點擊“啟動”按鈕時,會調用onCreate和onStart方法,在沒有點擊“停止”按鈕前,不管點擊多少次“啟動”按鈕,都只會調用onStart。而點擊“停止”按鈕時則調用onDestroy。再次點擊 “停止”按鈕,會發現不會進入service的生命周期的,即不會再調用onCreate,onStart和onDestroy,而onBind在點擊“啟動”和“停止”按鈕時都沒有調用。