QQ交流群:668524118? ? ??kotlin中文學(xué)習(xí)交流
1.遠(yuǎn)程服務(wù)簡(jiǎn)介
什么是遠(yuǎn)程服務(wù)
遠(yuǎn)程服務(wù)(Remote Service)也被稱之為獨(dú)立進(jìn)程摇展,它不受其它進(jìn)程影響,可以為其它應(yīng)用程序提供調(diào)用的接口——實(shí)際上就是進(jìn)程間通信IPC(Inter-Process Communication)玄柠,Android提供了AIDL(Android Interface Definition Language,接口描述語(yǔ)言)工具來(lái)幫助進(jìn)程間接口的建立诫舅。
在Android中羽利,不同的應(yīng)用屬于不同的進(jìn)程(Process),一個(gè)進(jìn)程不能訪問(wèn)其它進(jìn)程的存儲(chǔ)(可以通過(guò)ContentProvider實(shí)現(xiàn)刊懈,如:通訊錄的讀取)这弧。
遠(yuǎn)程服務(wù)的適用場(chǎng)景
一般適用于為其它應(yīng)用程序提供公共服務(wù)的Service,這種Service即為系統(tǒng)常駐的Service(如:天氣服務(wù)等)虚汛。
遠(yuǎn)程服務(wù)的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
1.遠(yuǎn)程服務(wù)有自己的獨(dú)立進(jìn)程匾浪,不會(huì)受到其它進(jìn)程的影響;
2.可以被其它進(jìn)程復(fù)用卷哩,提供公共服務(wù)蛋辈;
3.具有很高的靈活性。
缺點(diǎn)
相對(duì)普通服務(wù)将谊,占用系統(tǒng)資源較多冷溶,使用AIDL進(jìn)行IPC也相對(duì)麻煩。
2.遠(yuǎn)程服務(wù)的創(chuàng)建
定義AIDL接口
通過(guò)AIDL文件定義服務(wù)(Service)向客戶端(Client)提供的接口尊浓,我們需要在對(duì)應(yīng)的目錄下添加一個(gè)后綴為.aidl的文件(注意逞频,不是.java),IMyAidlInterface.aidl文件內(nèi)容如下:
packagecom.zihao.remoteservice.server;interfaceIMyAidlInterface{StringgetMessage();}
注:如果服務(wù)端與客戶端不在同一App上,需要在客戶端眠砾、服務(wù)端兩側(cè)都建立該aidl文件虏劲。
新建Remote Service
在遠(yuǎn)程服務(wù)中,通過(guò)Service的onBind()褒颈,在客戶端與服務(wù)端建立連接時(shí),用來(lái)傳遞Stub(存根)對(duì)象励堡。
// 遠(yuǎn)程服務(wù)示例publicclassRemoteServiceextendsService{publicRemoteService(){ }@OverridepublicIBinderonBind(Intent intent){returnstub;// 在客戶端連接服務(wù)端時(shí)谷丸,Stub通過(guò)ServiceConnection傳遞到客戶端}// 實(shí)現(xiàn)接口中暴露給客戶端的Stub--Stub繼承自Binder,它實(shí)現(xiàn)了IBinder接口privateIMyAidlInterface.Stub stub =newIMyAidlInterface.Stub(){// 實(shí)現(xiàn)了AIDL文件中定義的方法@OverridepublicStringgetMessage()throwsRemoteException{// 在這里我們只是用來(lái)模擬調(diào)用效果,因此隨便反饋值給客戶端return"Remote Service方法調(diào)用成功";? ? ? ? }? ? }; }
同時(shí)应结,在AndroidManifest.xml中對(duì)Remote Service進(jìn)行如下配置:
如果客戶端與服務(wù)端在同個(gè)App中刨疼,AndroidManifest.xml中設(shè)置Remote Service的andorid:process屬性時(shí)泉唁,如果被設(shè)置的進(jìn)程名是以一個(gè)冒號(hào)(:)開(kāi)頭的,則這個(gè)新的進(jìn)程對(duì)于這個(gè)應(yīng)用來(lái)說(shuō)是私有的揩慕,當(dāng)它被需要或者這個(gè)服務(wù)需要在新進(jìn)程中運(yùn)行的時(shí)候亭畜,這個(gè)新進(jìn)程將會(huì)被創(chuàng)建。如果這個(gè)進(jìn)程的名字是以小寫(xiě)字符開(kāi)頭的迎卤,則這個(gè)服務(wù)將運(yùn)行在一個(gè)以這個(gè)名字命名的全局的進(jìn)程中拴鸵,當(dāng)然前提是它有相應(yīng)的權(quán)限。這將允許在不同應(yīng)用中的各種組件可以共享一個(gè)進(jìn)程蜗搔,從而減少資源的占用劲藐。
3.客戶端調(diào)用遠(yuǎn)程服務(wù)接口
在客戶端中建立與Remote Service的連接,獲取Stub樟凄,然后調(diào)用Remote Service提供的方法來(lái)獲取對(duì)應(yīng)數(shù)據(jù)聘芜。
publicclassMainActivityextendsAppCompatActivity{privateIMyAidlInterface iMyAidlInterface;// 定義接口變量privateServiceConnection connection;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindRemoteService(); }privatevoidbindRemoteService(){ Intent intentService =newIntent(); intentService.setClassName(this,"com.zihao.remoteservice.RemoteService"); connection =newServiceConnection() {@OverridepublicvoidonServiceConnected(ComponentName componentName,IBinder iBinder){// 從連接中獲取Stub對(duì)象iMyAidlInterface = IMyAidlInterface.Stub.asInterface(iBinder);// 調(diào)用Remote Service提供的方法try{ Log.d("MainActivity","獲取到消息:"+ iMyAidlInterface.getMessage()); }catch(RemoteException e) { e.printStackTrace(); } }@OverridepublicvoidonServiceDisconnected(ComponentName componentName){// 斷開(kāi)連接iMyAidlInterface =null; } }; bindService(intentService, connection, Context.BIND_AUTO_CREATE); }@OverrideprotectedvoidonDestroy(){super.onDestroy();if(connection !=null) unbindService(connection);// 解除綁定}}
log.png
通信示意圖.png
4.拓展閱讀
Android:關(guān)于聲明文件中android:process屬性說(shuō)明
【Android】Service前臺(tái)服務(wù)的使用
轉(zhuǎn)自:http://www.reibang.com/p/4a83becd758e