Service寫起來步驟有些多,而且有的寫錯了就不會有效果,所以我整理一下,以后自己看著能好想起來
Service是Android四大組件之一,主要為了程序退出后仍然可以存在.但是Service實際運行在主線程,請不要做太耗時的操作,有耗時操作可以在Service中再建一個子線程來完成
那么來寫一下Service的基本使用方法吧
首先我們需要新建一個類來繼承Service 然后必須在AndroidManifest中注冊,與activity同級
public class NewService extends Service{ @Nullable @Override public IBinder onBind(Intent intent) { return null; }}寫完直接復寫出來的方法是onBind(),這個方法很重要,不過返回值暫時為null在這時我們就要了解一下Service的生命周期了,Service的生命周期有兩種,而這是由它的啟動方式決定的.
兩種啟動方式分別為.context.startService()和 context.bindService()第一種是直接開始,這一種服務可以在程序結束后繼續運行
第二種是將服務與組件(比如Activity)綁定,程序結束時必須解除綁定,不然會報錯,單純被綁定的服務在綁定的組件結束時也會結束,但是綁定的服務可以獲得一個binder對象,以此來調用服務中的方法,對服務進行操作,如音樂播放器 不過Service是可以同時被start和bind的
那么我們綁定服務時獲取的Ibinder對象就是我們復寫的onBind方法的返回值,但是服務中現在沒有Ibinder對象,我們需要在服務中創建一個類繼承自Binder
并且在這個類中寫我們希望操作服務做的方法 比如我這里傳入了發短信的數據,在send==true的時候,我會在onCreate中進行發短信的操作(我要做的是延時發送,所以沒有把所有操作放在Binder中)
public class MyBinder extends Binder { public void sendmsg(int time, String content, String num) { time1 = time; content1 = content; num1 = num; send = true; }}這時候我們有了一個MyBinder內部類,但是還沒有一個對象 so我們要實例化一個對象PRivate MyBinder myBinder; 然后我們要復寫onCreate方法 onCreate方法是Service的兩種生命周期的第一個方法,一定會執行,并且只執行一次
會變化的變量初始化操作不要寫在上面,寫在生命周期中 然后我們在onCreate中初始化對象 并且將onBind方法中的返回值改為這個對象(這一步一定不要忘)
@Overridepublic void onCreate() { super.onCreate(); myBinder = new MyBinder();這時我們有了binder對象,有了binder類中我們要做的操作,并且已經注冊了,那么我們服務這個類的所有操作就完成了,接下來我們要找到組件來綁定和使用它.首先我們需要一個連接服務的對象 和一個對服務進行操作的binder對象(這個對象由Service提供) 還有一個Intent(用于啟動服務,兩種啟動方式都需要)
private ServiceConnection serviceConnection; private MyService.MyBind myBind;private Intent start;start = new Intent(this, NewService.class);在onCreate中初始化的時候會直接復寫兩個方法
serviceConnection = new ServiceConnection() { /** * 當服務連接成功的時候會回調--有坑 Secveice中的bind返回值為空時不調用此方法 * @param componentName * @param iBinder */ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.e(TAG, "onServiceConnected:-------- "); //將onbind方法的返回值,賦值到myBinder上 myBind = (NewService.MyBind) iBinder; } /** * 當服務,被殺死時會回調,例如,內存不夠被干掉 * @param componentName */ @Override public void onServiceDisconnected(ComponentName componentName) { Log.e(TAG, "onServiceDisconnected:--------------------- "); }};這時候我們還沒有啟動Service
Service 的startService和stopService需要一個Intent 綁定服務需要一個Intent ,一個連接服務對象,還有一個flags(這個我一直是選Service.BIND_AUTO_CREATE)
服務解除綁定需要 一個連接服務對象(只要綁定過,那么這個Activity退出時必須做的) 當既Start又bind的時候我們需要既stop又unbind
startService(start);stopService(start);//綁定服務bindService(start, serviceConnection, Service.BIND_AUTO_CREATE);//解綁服務unbindService(serviceConnection);我們只有在綁定服務后才可以使用binder
使用很簡單
myBind.sendmsg(1,"這是一條延時發送的短信,延時一秒","88888");這樣我們就可以與Service進行交互了
-------------------------------------------------------------------底下有的是別的網站摘下來的--------------------------------------------------------------------------------------------------------
重寫生命周期的回調方法
onCreate()何時:首次創建服務時。注意:若服務已在運行,則不會調用此方法。onDestroy()何時:當服務不再使用且將被銷毀時。作用:清理所有資源,如線程、注冊的偵聽器、接收器等。 注意:這是服務接收的最后一個調用。int onStartCommand(Intent intent, int flags, int startId)何時:當另一個組件調用startService()請求啟動服務時。參數:intent:startService()啟動服務時傳入的Intent;startId:唯一id標識此次服務的啟動請求。返回值:描述系統應該如何在服務終止的情況下繼續運行服務。IBinder onBind(Intent it)何時:當另一個組件調用bindService()與服務綁定時。返回值:供客戶端與服務進行通信。/** * Created by dllo on 17/1/16. * 要使用服務,需要先建立一個類,繼承Service抽象類 * 實現方法 * 還要去Manifest文件中注冊一下 *//** * 如何與服務進行交換 * 推薦使用Binder形式 * 如何使用Binder * 第一步: 建立一個MyService的內部類Mybinder類,繼承Binder * 第二步: 聲明一個成員的MyBinder對象,在服務的onCreate方法中 * 對MyBinder初始化 * 第三步: 將這個MyBinder對象,作為OnBind方法的返回值返回 * 第四步: 在與服務綁定的類中聲明一個MyBinder的成員變量 * 在OnServiceConnected回調中對該成員變量進行賦值(ServiceConnection 中的復寫方法) * 這樣,服務中的myBinder對象就被傳遞到了綁定服務的淚中 * 通過操作該myBinder對象,調用該MyBinder類中的各種方法 * 就可以操作MyService中的各種屬性 */
當Service已經被一個Activity綁定時,另一個Activity綁定時不會走onBind方法,但會獲得一個binder,這個binder是最開始綁定時返回的binder,存在第三方中,再有綁定的就直接把binder塞給它
新聞熱點
疑難解答