Android Service學習篇二:Service啓動方式之startService

       由上面的生命週期圖能夠看出,它的生命週期只有三個階段: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方法

相關文章
相關標籤/搜索