標籤:android開發
什麼是Service?
一、Service
1.Service簡介 Service為Android四大組件之一,Service與Activity組件相似,都代表可執行檔程式且有自己的生命週期,唯一的區別是Activity組件提供介面方便人機互動而Service只在後台運行且沒有互動介面。需要注意的是,Service不是一個單獨的進程或為了防止應用出現無反應錯誤單獨的線程,它像其他應用對象一樣運行在其主控處理序的主線程中。當然,如果我們希望自己的Service能夠在後台運行MP3或者網路下載,我們可以建立一個線程來實現。
2.Service的生命週期由於Service可由兩種方式啟動:Context.startService()和Context.bindService().(1)Context.startService()方法:通過該方法啟動Service,訪問者(用戶端)與Service之間沒有關聯,即使訪問者退出了,Service仍然運行。調用Context.startService()觸發的Service生命週期方法: onCreate()->onStartCommand(Intent, int, int) ->Service運行-> Context.stopService()或 stopSelf()->Service被關閉(2)Context.bindService()方法:通過該方法啟動Service,訪問者(用戶端)與Service綁定在一起,訪問者一旦退出,Service也就終止了。調用Context.startService()觸發的Service生命週期方法: onCreate()->OnBind(Intent)->用戶端綁定到Service->OnUnbind()->onDestory()->Service被關閉升華筆記1:1.當調用Context.bindService()方法啟動一個Service時,不會執行onStartCommand(Intent, int, int)方法;2.當Activity(用戶端的Activiy)調用BindService()綁定一個已啟動的Service(Activity起初通過startService()方法啟動)時,系統只是把Service內部IBinder對象(由onBind()方法返回)傳遞給Acitvity,並不會把該Service生命週期完全"綁定"到該Activity,因而當Activity調用unBindService()方法取消與該Service的綁定時,也只是切斷該Activity與Service之間的關聯,並不能停止該Service組件。
3.API-Servicepublic abstract class Service(1)繼承關係java.lang.Object ? android.content.Context ? android.content.ContextWrapper ? android.app.Service(2)構造方法 Service()但是,一般我們在開發Service時主要是通過Content.getService()方法來擷取Service類對象。(3)常用方法(Service組件方法)void OnCreate():當該Service第一次被建立後將立即被調用;public int onStartCommand(Intent intent, int flags, int startId):每次用戶端調用startService(Intent)方法啟動指定Service時都會被調用,用戶端傳入的參數:Intent:由startService(Intent)傳入的"意圖".public abstract boolean stopService (Intent service):用戶端調用該方法關閉Servicepublic final void stopSelf ():Service自動關閉public abstract IBinder onBind (Intent intent):該方法是Service子類必須實現的方法,其返回一個IBinder對象,用戶端應用程式可通過該對象與Service組件通訊。參數Intent對象用於將用戶端綁定到Service,傳遞給Context.bindService。boolean onUnbind(Intent intent):當該Service上綁定的所有用戶端都取消連結時將會調用該方法void onDestory():當該Service被關閉之前將會調用該方法,Service將會清理其佔有的所有資源(包括所有線程、註冊在Service上的接受者)。
二、開發Service基本思路
1.建立、配置Service(1)定義一個繼承於Service的子類,如果希望Service組件完成某些事情,我們只要在onCreate()或onStartCommand()方法中定義相關的業務代碼即可。一個Service組件的架構如下:\src\service\FirstService.java
public class FirstService extends Service{ /*a.必須實現的方法,返回一個IBinder對象給用戶端以便實現通訊*/ @Override public IBinder onBind(Intent arg0) { return null; } /*b.Service被建立時回調該方法*/ @Override public void onCreate() { super.onCreate(); System.out.println("Service is Created"); } /*c.Service被啟動時回調該方法*/ @Override public int onStartCommand(Intent intent,int flags,int startId) { Sytem.out.println("Service is Started"); return START_STICKY; } /*d.Service被關閉之前回調*/ @Override public void onDestroy() { super.onDestroy(); System.out.println("Service is Destroyed"); }}
2.在AndroidManifest.xml檔案中配置該Service 定義了上面的Service之後,接下來需要在AndroidManifest.xml檔案中配置該Service,配置Service使用<service../>元素。與配置Activity相似的是,配置Service時也可為<service../>元素配置<intent-filter../>子項目,用於說明該Service可被哪些Intent啟動。
<!--配置一個Service組件--><service android:name=".FirstService"> <intent-filter> <!--為該service組件的intent-filter配置action--> <action android:name="com.example.service.FIRST_SERVICE"/> </intent-filter></service>
升華筆記2: Service是Android四大組件中與Activity最相似的組件,它們都代表可執行檔程式。所以,開發Service類似於開發Activity,我們只需定義一個繼承Service的子類並且在AndroidManifest.xml檔案中配置該Service後,就能在程式中運行該Serviec。如何啟動一個Service呢?我們可以在本應用的Activity子類中通過Context.startService()方法或Context.bindService()方法啟動一個service,也可以在另一個應用的Activity子類中通過Context.startService()方法或Context.bindService()方法啟動這個service.
3.啟動和停止Service 當Service開發完成後,我們可以在自身應用的Activity子類中啟動該Service,也可以在其他應用中啟動該Service。這裡,我們在本應用中啟動(關閉)該Service,使用Content.startService(Intent intent)方法。\src\service\StartService
public class StartServiceTest extends Activity{ Button start,stop; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //擷取程式介面按鈕中的start、stop兩個按鈕 start = (Button) findViewById(R.id.start); stop = (Button) findViewById(R.id.stop); //建立啟動Service的Intent final Intent intent = new Intent(); //為Intent設定Action屬性 intent.setAction("com.example.service.FIRST_SERVICE"); start.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { //啟動指定Service startService(intent); } }); stop.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { //關閉指定Service stopService(intent); } }); }} 通過以上3步,我們就算完成了一個Service及使用該Service的應用程式(Service為該應用程式的組成部分)。升華筆記3:1.為Intent設定Action屬性,主要作用是指定啟動哪個Service。其中,"com.example.service.FIRST_SERVICE"在Service的AndroidManifest.xml設定檔中的<service../>元素的<intent-filter../>子項目中配置該Service的action屬性。2.該Activity通過Content.startService(Intent intent)方法啟動指定的Service,每當Service被建立時會回調onCreate方法,每次Service被啟動時都會回調onStart方法--多次啟動一個已有的Service組件將不會再回調onCreate方法,但每次啟動時都會回調onStartCommand()方法。
參考:http://wear.techbrood.com/reference/android/app/Service.html
Android學習筆記二十三.Service組件入門(一).什麼是Service?