Android 啟動和停止服務

童思宇發表於2018-02-05

本篇文章還是在Android 服務(service)的基礎用法的基礎上進行修改,定義好了服務之後,下面就來看一下如何去啟動和停止這個服務,啟動和停止的方法當然你也不會陌生,主要是藉助Intent來實現的,下面我們在ServiceTest專案中嘗試去啟動和停止MyService這個服務.

activity_main.xml中的程式碼,如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.servicetest.MainActivity">

    <Button
        android:id="@+id/start_service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Service"
        android:textAllCaps="false"/>
    
    <Button
        android:id="@+id/stop_service"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop Service"
        android:textAllCaps="false"
        app:layout_constraintTop_toBottomOf="@id/start_service"/>

</android.support.constraint.ConstraintLayout>
在佈局檔案中加入了兩個按鈕,分別是用於啟動和停止服務的.

MainActivity.java中的程式碼,如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button startService = findViewById(R.id.start_service);
        Button stopService = findViewById(R.id.stop_service);
        startService.setOnClickListener(this);
        stopService.setOnClickListener(this);
        
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.start_service:
                Intent startIntent = new Intent(this,MyService.class);
                startService(startIntent);//啟動服務
                break;
            case R.id.stop_service:
                Intent stopIntent = new Intent(this,MyService.class);
                stopService(stopIntent);//停止服務
                break;
                default:
                    break;
        }
    }
}
可以看到,這裡在onCreate()方法中分別獲取到了Start Service按鈕和Stop Service按鈕的例項,並給它們註冊了點選事件,然後在Start Service按鈕的點選事件裡,我們構建了一個Intent物件,並呼叫startService()方法來啟動MyService服務,在Stop Service按鈕的點選事件裡,我們同樣構建了Intent物件,並呼叫stopService()方法來停止MyService這個服務,startService()和stopService()方法都是定義在Context類中,所以我們在活動裡可以直接呼叫這兩個方法,注意,這裡完全是由活動來決定服務如何停止的,如果沒有點選Stop Service按鈕,服務就會一直處於執行狀態,那服務有沒有什麼辦法讓自己停止下來呢?當然是可以的,只需要在MyService的任何一個位置呼叫stopSelf()方法就能讓這個服務停止下來了.

那麼接下來又有一個問題,我們如何才能證實服務已經成功啟動或者停止了呢?最簡單的方法就是在MyService的幾個方法中加入列印日誌,如下:

public class MyService extends Service {

    private static final String TAG = "MyService";
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: executed");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand: executed");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: executed");
    }
}
現在可以執行一下程式來進行測試,程式的主介面如圖:

點選一下Start Service按鈕,觀察logcat中的列印日誌,如下:

MyService中的onCreate()和onStartCommand()方法都執行了,說明這個服務確實已經啟動成功了,然後再點選一下Stop Service按鈕,觀察logcat中的列印日誌,如下:


由此證明,MyService確實已經成功停止下來了.

其實onCreate()方法是在服務第一次建立的時候呼叫的,而onStartCommand()方法則在每次啟動服務的時候都會呼叫,由於剛才我們是第一次點選Start Service按鈕,服務此時還未建立,所以兩個方法都會執行,之後如果你再連續多點選幾次Start Service按鈕,你就會發現只有onStartCommand()方法會得到執行了.

相關文章