由上面的生命週期圖能夠看出,它的生命週期只有三個階段:onCreate、onStartCommand、onDestroy。
java
須要注意的有:
android
1. 若是是調用者直接退出而沒有調用stopService的話,那麼被啓動的Service會一直在後臺運行,直至它的stopService方法被調用,或者它本身調用stopSelf方法。
app
2. 在服務未被建立時,系統會先調用服務的onCreate方法,接着調用onStartCommand方法。若是調用startService方法前服務已經被建立,那麼會再次調用onStartCommand方法。而且,無論調用了多少次onStartCommand方法,只須要一次stop即可以將相應的service關閉。
ide
3. 具體的操做是在onStartCommand方法中執行的。佈局
爲了便於理解,咱們建立一個工程,命名爲ServiceINS:this
package com.example.serviceins; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; /** * startService: 服務在同一時間只會被建立一次,能夠經過外部調用stopService或自身調用stopSelf來終止服務 * * 當執行一個已啓動的服務,會直接調用onStartCommand方法來執行任務 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 啓動一個服務 * * @param view */ public void startClick(View view) { Intent intent = new Intent(this, MyService.class); startService(intent); } /** * 中止一個服務 * * @param view */ public void stopClick(View view) { Intent intent = new Intent(this, MyService.class); stopService(intent); } }
在佈局中加入兩個按鈕:spa
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="startClick" android:text="啓動Service" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="stopClick" android:text="中止Service" /> </LinearLayout>
實現一個Service:code
package com.example.serviceins; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); System.out.println("MyService-onCreate"); } // 在該方法中實現服務的核心業務 @Override public int onStartCommand(Intent intent, int flags, int startId) { for (int i = 0; i < 20; i++) { System.out.println("onStartCommand" + i); } return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); System.out.println("MyService-onDestroy"); } }
<service android:name=".MyService" android:enabled="true"> </service>
下面,咱們經過操做來觀察一下LogCat中的輸出狀況:
orm
首先點擊「啓動Service」,以下圖,前後執行了Service當中的onCreate方法和onStartCommand方法xml
再點擊一次「啓動Service」,這時,咱們看到再次執行了一次onStartCommand中的方法,但並無再次去調用onCreate方法
而後依次點擊「中止Service」和「啓動Service」,只調用了一次onDestroy方法就將service關閉掉了,再次開啓service的時候又會從新調用onCreate和onStartCommand方法