服務(wù)是一個后臺運行的組件,執(zhí)行長時間運行且不需要用戶交互的任務(wù)。即使應(yīng)用被銷毀也依然可以工作。服務(wù)基本上包含兩種狀態(tài) -
服務(wù)擁有生命周期方法,可以實現(xiàn)監(jiān)控服務(wù)狀態(tài)的變化,可以在合適的階段執(zhí)行工作。下面的左圖展示了當(dāng)服務(wù)通過startService()被創(chuàng)建時的聲明周期,右圖則顯示了當(dāng)服務(wù)通過bindService()被創(chuàng)建時的生命周期:
要創(chuàng)建服務(wù),你需要創(chuàng)建一個繼承自Service基類或者它的已知子類的Java類。Service基類定義了不同的回調(diào)方法和多數(shù)重要方法。你不需要實現(xiàn)所有的回調(diào)方法。雖然如此,理解所有的方法還是非常重要的。實現(xiàn)這些回調(diào)能確保你的應(yīng)用以用戶期望的方式實現(xiàn)。
下面的主服務(wù)演示了每個方法的生命周期 - package cn.uprogrammer.androidservices;import android.app.Service;import android.os.IBinder;import android.content.Intent;import android.os.Bundle;public class HelloService extends Service { /** 標(biāo)識服務(wù)如果被殺死之后的行為 */ int mStartMode; /** 綁定的客戶端接口 */ IBinder mBinder; /** 標(biāo)識是否可以使用onRebind */ boolean mAllowRebind; /** 當(dāng)服務(wù)被創(chuàng)建時調(diào)用. */ @Override public void onCreate() { } /** 調(diào)用startService()啟動服務(wù)時回調(diào) */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return mStartMode; } /** 通過bindService()綁定到服務(wù)的客戶端 */ @Override public IBinder onBind(Intent intent) { return mBinder; } /** 通過unbindService()解除所有客戶端綁定時調(diào)用 */ @Override public boolean onUnbind(Intent intent) { return mAllowRebind; } /** 通過bindService()將客戶端綁定到服務(wù)時調(diào)用*/ @Override public void onRebind(Intent intent) { } /** 服務(wù)不再有用且將要被銷毀時調(diào)用 */ @Override public void onDestroy() { }} 實例這個例子將通過簡單地步驟為你展示如何創(chuàng)建自己的Android服務(wù)。按照下面的步驟來修改之前在Hello World實例章節(jié)中創(chuàng)建的Android應(yīng)用程序:
下面是主活動文件src/cn.uprogrammer.androidservices/MainActivity.java文件所修改的內(nèi)容。這個文件包含所有基本的生命周期方法。我們添加了startService()和stopService()方法來啟動和停止服務(wù)。 package cn.uprogrammer.androidservices;import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.content.Intent;import android.view.View;public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } // Method to start the service public void startService(View view) { startService(new Intent(getBaseContext(), MyService.class)); } // Method to stop the service public void stopService(View view) { stopService(new Intent(getBaseContext(), MyService.class)); }} 以下是src/cn.uprogrammer.androidservices/MyService.java的內(nèi)容。這個文件可以基于需求實現(xiàn)一個或多個服務(wù)關(guān)聯(lián)的方法。對于新人,我們只實現(xiàn)onStartCommand()和onDestroy() - package cn.uprogrammer.androidservices;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.widget.Toast;public class MyService extends Service { @Override public IBinder onBind(Intent arg0) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { // Let it continue running until it is stopped. Toast.makeText(this, '服務(wù)已經(jīng)啟動', Toast.LENGTH_LONG).show(); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, '服務(wù)已經(jīng)停止', Toast.LENGTH_LONG).show(); }} 下面將修改AndroidManifest.xml文件。這里添加 以下是res/layout/activity_main.xml文件的內(nèi)容,包含兩個按鈕: 下面是res/values/strings.xml的內(nèi)容,來定義兩個新的常量: 讓我們運行剛剛修改的My Application應(yīng)用程序。我假設(shè)你已經(jīng)在安裝環(huán)境時創(chuàng)建了AVD。打開你的項目中的活動文件,點擊工具欄中的圖標(biāo)來在Android Studio中運行應(yīng)用程序。Android Studio在AVD上安裝應(yīng)用程序并啟動它。如果一切順利,將在模擬器窗口上顯示如下: 現(xiàn)在點擊'啟動服務(wù)'按鈕來啟動服務(wù),這將執(zhí)行我們編寫的onStartCommand()方法,一條'服務(wù)已經(jīng)啟動'的消息在模擬器的底部出現(xiàn),如下:
|
|