目录
前言
简单记录一下aidl的使用,方便自己查阅和复习。
正文
因为客户端和服务端都需要引入相同的aidl的定义,因此这里单独吧aidl文件作为一个lib库。
Biu2Aidl库
Biu2Aidl是lib库,存放客户端和服务端共同的aidl定义和Constant类。
IBook.aidl
// IBook.aidl package com.biumall.biu2aidl; interface IBook { //发送Book信息 void sendBookInfo(String bookName); }
这个只是开始,所以定义一个简单点的。
AidlConstant.java
定义一些常量,方便统一修改。
public class AidlConstant { public final static String TAG= "Aidl_"; public static final String SERVER_SERVICE_PACKAGE = "com.biumall.biu2server"; public static final String SERVER_SERVICE_NAME = "com.biumall.biu2server.service.AidlServerService"; public static final String SERVER_SERVICE_AIDL_ACTION = "com.biumall.action.START_SERVER_SERVICE"; }
build.gradle中添加
buildFeatures{aidl true}
Biu2Server服务端
AndroidManifest.xml
<service android:name=".service.AidlServerService" android:exported="true"> <intent-filter> <action android:name="com.biumall.action.START_SERVER_SERVICE" /> </intent-filter> </service>
AidlServerService.java
这个就是返回BookIBinder,并实现aidl中的接口,这样就客户端就可以跟服务端通信了。
public class AidlServerService extends Service { private static final String TAG = "AidlServerService_"; @Nullable @Override public IBinder onBind(Intent intent) { //返回IBinder return new BookIBinder(); } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "onCreate: "); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: "); } // private static class BookIBinder extends IBook.Stub { @Override public void sendBookInfo(String bookName) throws RemoteException { Log.d(TAG, "sendBookInfo bookName : " + bookName); } } }
Biu2Client客户端
ClientApp.getContext()是实现Application类中返回的Context,这里懒得附上。
下面是在定义绑定和解除绑定的。
//获取到mIBook后就可以跟服务端进行通信 private IBook mIBook; //绑定 private void bindService() { Log.d(TAG, "bindService: "); if (null == mIBook) { Intent intent = new Intent(); intent.setPackage(AidlConstant.SERVER_SERVICE_PACKAGE); intent.setAction(AidlConstant.SERVER_SERVICE_AIDL_ACTION); boolean bind = ClientApp.getContext().bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); Log.d(TAG, "bindService MediaService.class " + (bind ? "success ^_^" : "fail ~_~")); } } //解除绑定 private void unbindService() { Log.d(TAG, "unbindService: "); if (null != mIBook) { ClientApp.getContext().unbindService(mServiceConnection); mIBook = null; } } private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG, "onServiceConnected name : " + name + " , service :" + service); mIBook = IBook.Stub.asInterface(service); try { //向服务端发送消息 mIBook.sendBookInfo("Hello word!"); //linkToDeath监听 mIBook.asBinder().linkToDeath(new IBinder.DeathRecipient() { @Override public void binderDied() { Log.d(TAG, "binderDied : "); } }, 0); } catch (RemoteException e) { throw new RuntimeException(e); } } @Override public void onServiceDisconnected(ComponentName name) { Log.d(TAG, "onServiceDisconnected name : " + name); } };
参考文章
历史上的今天
暂无评论...
随机推荐
Launcher根据包名启动应用
前言很多项目中Launcher是有可能自定义的,毕竟Android原生的Launcher比较庞大,有时候需要的需求很简单,自己重新写Launcher也比较容易维护。为啥要根据包名启动,因为一个应用可能存在多个Activity,当按Home键退出后,再次从Launcher界面点击需要回到之前展示...
Android中onConfigurationChanged的总结
前言记录一下Android设备横屏、竖屏和分屏的适配说明。正文Android应用中不在AndroidManifest.xml做配置时,我的如下(这里配置很多,看你自己需求删减,这里也不一一介绍):<activity android:name=".MainActivity" ...
AndroidManifest.xml的configChanges配置简介
Android文档介绍configurationAndroid中的组件Activity在AndroidManifest.xml文件中可以指定参数android:configChanges,用于捕获手机状态的改变。如果Activity添加了android:configChanges属性,在当所指...
许钦文:花园的一角
荷花池和草地之间有着一株水杨,这树并不很高,也不很大,可是很清秀,一条条的枝叶,有的仰向天空,随风摆宕,笑嘻嘻的似乎很是喜欢阳光的照临;有的俯向水面,随风飘拂,和蔼可亲的似乎时刻想和池水亲吻;横在空中的也很温柔可爱,顺着风势摇动,好像是在招呼人去鉴赏,也像是在招呼一切可爱的生物。在同一池沿,距离这...
Can't determine type for tag
前言引入公共库库(commonLib)时,出现如下异常,说实话,看不懂哈,就问谷歌了。Can't determine type for tag '<macro name="m3_comp_assist_chip_container_shape">?attr/shapeAppeara...
TextView.setWidth()竟然失效了
前言TextView.setWidth()失效(无作用),其实好奇,既然没作用,为啥要预留这个方法呢?记录一下,方便自己查阅。正文既然要刨根问底,就需要看源码TextView。看了一下源码TextView.setWidth()//[来自谷歌翻译]//将 TextView 的宽度设置为...