Android四大元件之service
原文:https://blog.csdn.net/javazejian/article/details/52709857 ,詳細瞭解的童鞋可以看這篇原文,寫的很棒!
1.Service簡單概述 Service(服務)是一個一種可以在後臺執行長時間執行操作而沒有使用者介面的應用元件。服務可由其他應用元件啟動(如Activity),服務一旦被啟動將在後臺一直執行,即使啟動服務的元件(Activity)已銷燬也不受影響。 此外,元件可以繫結到服務,以與之進行互動,甚至是執行程序間通訊 (IPC)。 例如,服務可以處理網路事務、播放音樂,執行檔案 I/O 或與內容提供程式互動,而所有這一切均可在後臺進行,Service基本上分為兩種形式:
(1)啟動狀態(應用元件Activity 呼叫 服務啟動:startService() 服務停止:stopService(),該服務即會被銷燬)
當Activity通過呼叫startService()啟動服務時,服務即處於"啟動"狀態 . 一旦啟動,服務即可在後臺無限期執行,即使啟動服務的Activity已被銷燬也不受影響,除非手動呼叫才能停止服務,已啟動的服務通常是執行單一操作,而且不會將結果返回給呼叫方.
(2)繫結狀態(應用元件Activity呼叫bindService()繫結服務, 服務解綁:onUnbindService(),該服務即會被銷燬)
當應用元件Activity通過呼叫bindService()繫結到服務時,服務即處於"繫結"狀態 。 繫結服務提供了一個客戶端-伺服器介面
二、service生命週期
(1)startService啟動方式:
onCreate()------>onStartCommand()----------->onDestroy()
(2)bindService啟動方式
onCreate()--------->onBind()---------------->onUnbind()----------------->onDestroy()
三、manifest.xml配置檔案service宣告
<!-- 依賴主介面的service --> <service android:name=".AsyncInitService"> </service>
<service android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:isolatedProcess=["true" | "false"] android:label="string resource" android:name="string" android:permission="string" android:process="string" > . . . </service> android:exported:代表是否能被其他應用隱式呼叫,其預設值是由service中有無intent-filter決定的,如果有intent-filter,預設值為true,否則為false。為false的情況下,即使有intent-filter匹配,也無法開啟,即無法被其他應用隱式呼叫。
android:name:對應Service類名
android:permission:是許可權宣告
android:process:是否需要在單獨的程序中執行,當設定為android:process=”:remote”時,代表Service在單獨的程序中執行。注意“:”很重要,它的意思是指要在當前程序名稱前面附加上當前的包名,所以“remote”和”:remote”不是同一個意思,前者的程序名稱為:remote,而後者的程序名稱為:App-packageName:remote。
android:isolatedProcess :設定 true 意味著,服務會在一個特殊的程序下執行,這個程序與系統其他程序分開且沒有自己的許可權。與其通訊的唯一途徑是通過服務的API(bind and start)。
android:enabled:是否可以被系統例項化,預設為 true因為父標籤 也有 enable 屬性,所以必須兩個都為預設值 true 的情況下服務才會被啟用,否則不會啟用。
3.Service啟動服務 首先要建立服務,必須建立 Service 的子類(或使用它的一個現有子類如IntentService)。在實現中,我們需要重寫一些回撥方法,以處理服務生命週期的某些關鍵過程,下面我們通過簡單案例來分析需要重寫的回撥方法有哪些?
package com.zejian.ipctest.service;
import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable;
/** * Created by zejian * Time 2016/9/29. * Description:service simple demo */ public class SimpleService extends Service {
/** * 繫結服務時才會呼叫 * 必須要實現的方法 * @param intent * @return */ @Nullable @Override public IBinder onBind(Intent intent) { return null; }
/** * 首次建立服務時,系統將呼叫此方法來執行一次性設定程式(在呼叫 onStartCommand() 或 onBind() 之前)。 * 如果服務已在執行,則不會呼叫此方法。該方法只被呼叫一次 */ @Override public void onCreate() { System.out.println("onCreate invoke"); super.onCreate(); }
/** * 每次通過startService()方法啟動Service時都會被回撥。 * @param intent * @param flags * @param startId * @return */ @Override public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onStartCommand invoke"); return super.onStartCommand(intent, flags, startId); }
/** * 服務銷燬時的回撥 */ @Override public void onDestroy() { System.out.println("onDestroy invoke"); super.onDestroy(); } } 從上面的程式碼我們可以看出SimpleService繼承了Service類,並重寫了onBind方法,該方法是必須重寫的,但是由於此時是啟動狀態的服務,則該方法無須實現,返回null即可,只有在繫結狀態的情況下才需要實現該方法並返回一個IBinder的實現類(這個後面會詳細說),接著重寫了onCreate、onStartCommand、onDestroy三個主要的生命週期方法,關於這幾個方法說明如下:
onBind() 當另一個元件想通過呼叫 bindService() 與服務繫結(例如執行 RPC)時,系統將呼叫此方法。在此方法的實現中,必須返回 一個IBinder 介面的實現類,供客戶端用來與服務進行通訊。無論是啟動狀態還是繫結狀態,此方法必須重寫,但在啟動狀態的情況下直接返回 null。
onCreate() 首次建立服務時,系統將呼叫此方法來執行一次性設定程式(在呼叫 onStartCommand() 或onBind() 之前)。如果服務已在執行,則不會呼叫此方法,該方法只調用一次
onStartCommand() 當另一個元件(如 Activity)通過呼叫 startService() 請求啟動服務時,系統將呼叫此方法。一旦執行此方法,服務即會啟動並可在後臺無限期執行。 如果自己實現此方法,則需要在服務工作完成後,通過呼叫 stopSelf() 或 stopService() 來停止服務。(在繫結狀態下,無需實現此方法。)
onDestroy() 當服務不再使用且將被銷燬時,系統將呼叫此方法。服務應該實現此方法來清理所有資源,如執行緒、註冊的偵聽器、接收器等,這是服務接收的最後一個呼叫。