1. 程式人生 > >Service基本入門及AIDL跨程序通訊

Service基本入門及AIDL跨程序通訊

前言:在學習Service過程中,看其他人的部落格,講的不怎麼全,需要檢視多人的部落格才能弄明白。這篇文章是我個人總結。不正之處,還望大牛指正。寫的比較淺,適合入門操作。

一、Service是什麼?

1、Service是android四大元件之一,沒有前臺介面,在後臺執行。
2、Service執行在主執行緒,如果在Service中做很耗時操作,將會是程式ANR。
3、Service在後臺處理一些耗時的操作(不能很耗時),或者執行一些長期執行的任務

二、Service的基本用法

1、繼承Service類,重寫Service的四個方法

onCreate()、onStartCommend()、onBind()、onDestory()

2、Service的啟動方式

有兩種啟動方式 1、startService()和 bindService()

首先第一種:startService

經歷的生命週期是onCreate() –> onStartCommand 服務開啟,當用戶呼叫stopService()方法時服務呼叫onDestory(),服務就被銷燬。
注意:當一個服務已經被開啟之後,使用者再次呼叫startService時,生命週期就不會走onCreate(),只會呼叫onStartCommand方法。
所以在onCrate中做一些初始化操作,在onStartCommand做些業務類操作

第二種啟動方式 bindService()

使用者點選bindService之後,Service經歷的生命週期為onCreate() –> onBind()那麼Service就被啟動了,使用者呼叫unbindService(),Sevice呼叫 onUnbind()–> onDestory(),自此,服務就被銷燬了
注意:如果使用者同時呼叫了startService和bindService方法,那麼,若是使用者在銷燬Service的時候只調用了stopService,那麼service是不會呼叫onDestory()方法的,因為Service還有其他Activity的引用。也就是還和其他Activity綁定了,只有當呼叫unBindService時,Service才會呼叫onDestory();

三、Service跨程序通訊(AIDL)

1、AIDL(Android Interface Definition Language)
android介面定義語言,解決跨程序通訊,讓多個應用程式共享一個Service。
2、Android studio上使用AIDL的方法
這裡寫圖片描述
操作該方法之後會生成一個與java包同級的aidl包
這裡寫圖片描述
之後會生成如下所示的路徑
這裡寫圖片描述
然後在檔案中新增你需要的方法,然後build一下,生成如下的路徑
這裡寫圖片描述這裡寫圖片描述
新建一個Service類,在AndroidManifest.xml中註冊Service,由於另一個程序不知道服務中的Service是什麼名稱,所以用隱式呼叫註冊方式如下:
這裡寫圖片描述
Service程式碼中新增如下程式碼:
這裡寫圖片描述
重寫onBind()方法,並返回mBinder
3、再新建一個專案,命名為AIDLClient
說明:需要使用AIDL,就必須將ServiceTest(我建的服務類專案命名為ServiceTest)專案中的AIDL檔案這裡寫圖片描述
複製到AIDLCilent中,包括包名路徑:
具體操作和在ServiceTest中新建AIDL方式一樣,首先新建aidl包,然後再在改包下新建與ServiceTest一樣的包名這裡寫圖片描述,然後再將ServiceTest中的這裡寫圖片描述
檔案複製到AIDLClient中,build一下,aidl檔案複製完成。
再在AIDLCilent的activity_main.xml檔案中新增一個按鈕,在MainActivity中新增如下程式碼:
這裡寫圖片描述
注意:

Intent intent = new Intent("com.example.servicetest.IMyAidlInterface");
intent.setPackage("com.example.hhly_pc.servicetest");
bindService(intent, connection, BIND_AUTO_CREATE);

這三行程式碼中,若你沒有加中間那行程式碼 intent.setPackage(“com.example.hhly_pc.servicetest”),若你適配的手機版本為android 5.0之前的,那麼Service的隱式呼叫可以成功,若為5.0之後也就是從Lollipop開始,採用隱式呼叫,便會編譯出錯Service Intent must be explitict xxxx……解決辦法是設定Service的包名即可。