Mac Android Studio 远程bindSerVice之aidl
2015-11-11 11:09
309 查看
用了eclipse做完这个之后再到studio中写那叫一个磕磕碰碰,而且还是在Mac系统中。。。。话不多说,下面我来简单说说这玩意儿
我创建了两个项目,一个代表服务器端一个代表客户端,服务端的作用就开启服务用于客户端连接
服务端:
服务端我创建了一个服务和一个aidl文件。
服务:
创建一个类继承Service并实现里面的方法,为了突出体现客户端绑定这个服务效果,我在这个服务里创建了一个方法用于客户端调用,代码如下:
看到这里新手肯定有疑问,表心慌表着急,听我慢慢道来:
服务绑定成功之后会调用服务里的onBind()方法而且还是通过bindService的方式绑定,startService方式是不会执行这个方法的,我们就可以通过这个特性调用服务里面的方法。onBind()方法的返回值是IBinder对象,只要我们返回这个对象绑定成功之后就可以通过这个对象调用服务里面的方法了
步骤是:
本地:
创建一个内部类extends Binder类,在该内部类中创建一个方法,这个方法的作用就是调用服务里面的方法,onBind()方法的返回值就是这个内部类对象
但是通常情况下为了安全起见会先定义一个接口,在该内部类继承Binder的同时再实现这个接口,这个接口里面的方法实现后的作用当然也是调用服务里面的方法,绑定成功后直接调用这个接口对象的方法即可
远程:
不过现在是要远程绑定该服务,情况当然会有一点不一样了!
这个时候就涉及到aidl文件了,这个aidl文件就是一个继承了IInterface的接口(IMyAidlInterface),这个接口中有一个名为Stub的静态抽象内部类,这个Stub类继承了Binder类并实现了接口(IMyAidlInterface),所以只要把上面的继承 Binder类和实现接口的步骤直接替换为继承Stub就可以了
生成aidl文件:
步骤:File——>New——>AIDL——>AIDL File——>起名
完成之后在main文件夹下有一个aidl文件,该文件下有一个包,包名和你的项目包名相同,该包下就是aidl文件了,在该文件下定义抽象方法,格式与接口一样。注意该接口和这里面的方法都是没有权限修饰的
注意:aidl文件生成之后要点一下这个图标
这个图标在studio的工具栏上,恶心吧!!不注意就忽略了
服务端就完成了,不过完成之后要把这个服务运行起来不然绑定不到的
客户端:
新建一个项目,搞两个按钮,一个绑定服务,一个调用服务里面方法,这里的UI随便,只要能实现就行
项目新建之后就把之前生成的aidl文件粘贴到该项目的main文件夹下
绑定服务并调用服务中方法:
我创建了两个项目,一个代表服务器端一个代表客户端,服务端的作用就开启服务用于客户端连接
服务端:
服务端我创建了一个服务和一个aidl文件。
服务:
创建一个类继承Service并实现里面的方法,为了突出体现客户端绑定这个服务效果,我在这个服务里创建了一个方法用于客户端调用,代码如下:
public class MyService extends Service { @Nullable @Override public IBinder onBind(Intent intent) { //返回IBinder对象 return new IService(); } private class IService extends IMyAidlInterface.Stub{ @Override public void getSerViceMethod() throws RemoteException { //调用服务中方法 SeiviceMethod(); } } //服务中方法 private void SeiviceMethod() { Log.i("lanou","我是服务里面的方法"); } }
看到这里新手肯定有疑问,表心慌表着急,听我慢慢道来:
服务绑定成功之后会调用服务里的onBind()方法而且还是通过bindService的方式绑定,startService方式是不会执行这个方法的,我们就可以通过这个特性调用服务里面的方法。onBind()方法的返回值是IBinder对象,只要我们返回这个对象绑定成功之后就可以通过这个对象调用服务里面的方法了
步骤是:
本地:
创建一个内部类extends Binder类,在该内部类中创建一个方法,这个方法的作用就是调用服务里面的方法,onBind()方法的返回值就是这个内部类对象
但是通常情况下为了安全起见会先定义一个接口,在该内部类继承Binder的同时再实现这个接口,这个接口里面的方法实现后的作用当然也是调用服务里面的方法,绑定成功后直接调用这个接口对象的方法即可
远程:
不过现在是要远程绑定该服务,情况当然会有一点不一样了!
这个时候就涉及到aidl文件了,这个aidl文件就是一个继承了IInterface的接口(IMyAidlInterface),这个接口中有一个名为Stub的静态抽象内部类,这个Stub类继承了Binder类并实现了接口(IMyAidlInterface),所以只要把上面的继承 Binder类和实现接口的步骤直接替换为继承Stub就可以了
生成aidl文件:
步骤:File——>New——>AIDL——>AIDL File——>起名
完成之后在main文件夹下有一个aidl文件,该文件下有一个包,包名和你的项目包名相同,该包下就是aidl文件了,在该文件下定义抽象方法,格式与接口一样。注意该接口和这里面的方法都是没有权限修饰的
注意:aidl文件生成之后要点一下这个图标
这个图标在studio的工具栏上,恶心吧!!不注意就忽略了
服务端就完成了,不过完成之后要把这个服务运行起来不然绑定不到的
客户端:
新建一个项目,搞两个按钮,一个绑定服务,一个调用服务里面方法,这里的UI随便,只要能实现就行
项目新建之后就把之前生成的aidl文件粘贴到该项目的main文件夹下
绑定服务并调用服务中方法:
private IMyAidlInterface stub; //绑定按钮点击事件 public void bind(View view){ Intent intent = new Intent(); //这里的action要和注册服务时的action一致 intent.setAction("com.lanou3g.pay"); //这里的包名就是aidl文件所在的包名 intent.setPackage("com.lanou3g.zjl.aidlandservice"); bindService(intent, new MyConn(), BIND_AUTO_CREATE); Toast.makeText(this,"绑定成功",Toast.LENGTH_LONG).show(); } private class MyConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //绑定成功之后初始化Stub对象 stub = IMyAidlInterface.Stub.asInterface(iBinder); } @Override public void onServiceDisconnected(ComponentName componentName) { //绑定失败后执行 } } //调用服务中方法按钮点击事件 public void getMethod(View view){ try { stub.getSerViceMethod(); } catch (RemoteException e) { e.printStackTrace(); } }
相关文章推荐
- AndroidPN客户端源码简要分析
- android4.0 USB Camera实例(六)ffmpeg mpeg编码
- android4.0 USB Camera实例(五补充)jpg压缩
- Android XUtils使用详解
- 学Android---Manifest.xml
- android4.0 USB Camera实例(五)jpg压缩
- android4.0 USB Camera实例(四)CMOS
- android4.0 USB Camera实例(三)UVC
- Photoshop自动导出各尺寸Android和Iphone图标,支持新版Android Studio
- android 自定义控件方法以及实例
- android 4.0 USB Camera实例(二)应用层
- Android沉浸式状态栏
- android4.0 USB Camera实例(一)JNI层
- Android的ImageView中scaleType属性值的详解
- 说说你对Android系统的理解
- android 手机内存创建文件存储相关
- Universal-Image-Loader框架(android图片缓存)
- Android ContentProvider深入分析
- Android(CM)源码国内镜像下载
- Android快速SDK(12)文本pdf阅读器PdfViewer【傻瓜模式】