android: 服務的基本用法

來源:互聯網
上載者:User

標籤:

9.3   服務的基本用法

 

瞭解了 Android 多線程編程的技術之後,下面就讓我們進入到本章的正題,開始對服務 的相關內容進行學習。作為 Android 四大組件之一,服務也少不了有很多非常重要的知識點, 那我們自然要從最基本的用法開始學習了。

 

9.3.1    定義一個服務

 

首先看一下如何在項目中定義一個服務。建立一個 ServiceTest 項目,然後在這個項目中 新增一個名為 MyService 的類,並讓它繼承自 Service,完成後的代碼如下所示:

 

public class MyService extends Service {

 

@Override

public IBinder onBind(Intent intent) {

return null;

}

 

}

目前 MyService 中可以算是空空如也,但有一個 onBind()方法特別醒目。這個方法是 Service 中唯一的一個抽象方法,所以必須要在子類裡實現。我們會在後面的小節中使用到 onBind()方法,目前可以暫時將它忽略掉。

既然是定義一個服務,自然應該在服務中去處理一些事情了,那處理事情的邏輯應該寫 在哪裡呢?這時就可以重寫 Service 中的另外一些方法了,如下所示:

 

public class MyService extends Service {

 

@Override

public IBinder onBind(Intent intent) {

return null;

}

 

@Override

public void onCreate() {

super.onCreate();

}

 

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

 

return super.onStartCommand(intent, flags, startId);

}

 

@Override

public void onDestroy() {

super.onDestroy();

}

 

}

可以看到,這裡我們又重寫了 onCreate()、onStartCommand()和 onDestroy()這三個方法, 它們是每個服務中最常用到的三個方法了。其中onCreate()方法會在服務建立的時候調用,onStartCommand()方法會在每次服務啟動的時候調用,onDestroy()方法會在服務銷毀的時候 調用。

通常情況下,如果我們希望服務一旦啟動就立刻去執行某個動作,就可以將邏輯寫在 onStartCommand()方法裡。而當服務銷毀時,我們又應該在 onDestroy()方法中去回收那些不再使用的資源。

另外需要注意,每一個服務都需要在 AndroidManifest.xml 檔案中進行註冊才會生效,不知 道你有沒有發現,這是 Android 四大組件共有的特點。於是我們還應該修AndroidManifest.xml 檔案,代碼如下所示:

 

<manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.example.servicetest"

android:versionCode="1"android:versionName="1.0" >

……

<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >

……

<service android:name=".MyService" >

</service>

</application>

</manifest>

這樣的話,就已經將一個服務完全定義好了。

9.3.2    啟動和停止服務

 

定義好了服務之後,接下來就應該考慮如何去啟動以及停止這個服務。啟動和停止的方法當然你也不會陌生,主要是藉助 Intent 來實現的,下面就讓我們在 ServiceTest 項目中嘗試 去啟動以及停止 MyService 這個服務。

首先修改 activity_main.xml 中的代碼,如下所示:

 

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"

android:orientation="vertical" >

 

 

<Buttonandroid:id="@+id/start_service"android:layout_width="match_parent" android:layout_height="wrap_content"android:text="Start Service" />

 

<Buttonandroid:id="@+id/stop_service"android:layout_width="match_parent"android:layout_height="wrap_content" android:text="StopService" />

 

</LinearLayout>

這裡我們在布局檔案中加入了兩個按鈕,分別是用於啟動服務和停止服務的。 然後修改 MainActivity 中的代碼,如下所示:

 

public class MainActivity extends Activity implementsOnClickListener {

 

 

private Button startService;

 

 

private Button stopService;

 

 

@Override

protected voidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

startService = (Button) findViewById(R.id.start_service);

stopService = (Button) findViewById(R.id.stop_service);

 

 

 

startService.setOnClickListener(this);

stopService.setOnClickListener(this);

}

 

@Override

public void onClick(Viewv) {

switch (v.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 Serivce 按鈕 的點擊事件裡,我們同樣構建出了一個 Intent 對象,並調用 stopService()方法來停止 MyService這個服務。startService()和 stopService()方法都是定義在 Context 類中的,所以我們在活動裡 可以直接調用這兩個方法。注意,這裡完全是由活動來決定服務何時停止的,如果沒有點擊 Stop Service 按鈕,服務就會一直處於運行狀態。那服務有沒有什麼辦法讓自已停止下來呢? 當然可以,只需要在 MyService 的任何一個位置調用 stopSelf()方法就能讓這個服務停止下 來了。

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

 

public class MyService extends Service {

 

 

@Override

public IBinder onBind(Intent intent) {

return null;

 

 

 

}

 

 

@Override

public void onCreate() {

super.onCreate();

Log.d("MyService", "onCreate executed");

}

 

 

@Override

public int onStartCommand(Intent intent, int flags, int startId){

Log.d("MyService", "onStartCommandexecuted");

return super.onStartCommand(intent, flags, startId);

}

 

 

@Override

public void onDestroy() {

super.onDestroy();

Log.d("MyService", "onDestroy executed");

}

 

 

}

現在可以運行一下程式來進行測試了,程式的主介面 9.5 所示。

圖   9.5

 

點擊一下 Start Service 按鈕,觀察 LogCat 中的列印日誌 9.6所示。

 

圖   9.6

 

MyService 中的 onCreate()和 onStartCommand()方法都執行了,說明這個服務確實已經啟動成功了,並且你還可以在正在啟動並執行服務列表中找到它, 9.7所示。

 

圖   9.7

 

然後再點擊一下 Stop Service 按鈕,觀察 LogCat 中的列印日誌 9.8 所示。

 

圖   9.8

 

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

話說回來,雖然我們已經學會了啟動服務以及停止服務的方法,不知道你心裡現在有沒有一個疑惑,那就是 onCreate()方法和 onStartCommand()到底有什麼區別呢?因為剛剛點擊

Start Service 按鈕後兩個方法都執行了。

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

android: 服務的基本用法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.