Android开发中,Binder是一种跨进程通信方式,而使用AIDL可以实现Binder的工作。

如何使用它是了解它的第一步,本文章主要记录使用Binder的一些步骤。(代码思路参考《Android开发艺术探索》任玉刚 著)

1.创建两个activity

两个activity(OneActivity、TwoActivity),将OneActivity假设为服务端,TwoActivity假设为客户端,分别运行在不同进程中

在AndroidManifest.xml中,为TwoActivity设置进程,这样两个activity就分别运行在不同的进程中了

<activity android:name=".TwoActivity" android:process=":test"/>

2. 创建AIDL文件

在AIDL文件中声明客户端想要调用服务端的方法

interface IInfManager {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void setName(String name); String getName();
}

AIDL文件声明完,activity等文件并不能调用到IInfManager接口,需要在app的build.gradle文件中的android{}中添加

sourceSets{
main{
java.srcDirs = ['src/main/java', 'src/main/aidl']
}
}

然后点击sync now按钮,activity文件就可以调用到IInfManager接口了,可以在app\build\generated\source\aidl\debug文件下找到自动生成的IInfManager.java文件。

3.创建Service

Service中创建Binder对象,在onBind方法中返回这个对象,Binder对象中具体实现了IInfManager接口中的方法。Service需要在AndroidManifest.xml中注册。

public class InfManageService extends Service{

    private String name;

    @Override
public int onStartCommand(Intent intent, int flags, int startId) {
name = intent.getStringExtra("name");
return super.onStartCommand(intent, flags, startId);
} @Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
} private Binder binder = new IInfManager.Stub() {
@Override
public void setName(String mName) throws RemoteException {
name = mName;
} @Override
public String getName() throws RemoteException {
return name;
}
};
}

4.服务端OneActivity

OneActivity中设置按钮跳转至TwoActivity,这里为了简单,使用startService可以为InfManageService中name变量初始化"zhangsan"的值。也可以与客户端TwoActivity中一样,绑定service,建立连接,来设置name的值(具体参考下一步客户端的用法)。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one); Intent intent = new Intent(OneActivity.this, InfManageService.class);
intent.putExtra("name", "zhangsan");
startService(intent); btn_one_gototwo = (Button) findViewById(R.id.btn_one_gototwo); btn_one_gototwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(OneActivity.this, TwoActivity.class);
startActivity(intent);
}
});
}

5.客户端TwoActivity

首先绑定InfManageService服务,建立连接,连接成功后通过返回的IBinder对象可以获得IInfManager接口,可以通过这个接口去使用服务端的方法。

private TextView tv_two_name;
private Button btn_two_change; private IInfManager iInfManager; private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iInfManager = IInfManager.Stub.asInterface(service);
try {
tv_two_name.setText(iInfManager.getName());
Log.i("TwoActivity","first:" + iInfManager.getName());
iInfManager.setName("lisi");
Log.i("TwoActivity","next:" + iInfManager.getName());
}catch (RemoteException e){ }
} @Override
public void onServiceDisconnected(ComponentName name) { }
}; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two); tv_two_name = (TextView) findViewById(R.id.tv_two_name);
btn_two_change = (Button) findViewById(R.id.btn_two_change); Intent intent = new Intent(TwoActivity.this, InfManageService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE); btn_two_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
iInfManager.setName("wangmazi");
tv_two_name.setText(iInfManager.getName());
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
} @Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}

上面代码onServiceConnected方法中,首先在TwoActivity界面中显示了服务端的name变量内容"zhangsan"

Binder基本使用的更多相关文章

  1. 笔记:Binder通信机制

    TODO: 待修正 Binder简介 Binder是android系统中实现的一种高效的IPC机制,平常接触到的各种XxxManager,以及绑定Service时都在使用它进行跨进程操作. 它的实现基 ...

  2. Binder in Java

    Android在Native层实现了进程间的Binder通信,但是上层应用程序的开发及Framework的实现都是Java,用Java层再实现一次肯定是不合理的,Java可以通过JNI调用Native ...

  3. Binder In Native

    关于Binder的设计思想与Driver层实现细节可以看这个:Android Binder设计与实现 - 设计篇,这里首先简要概括一下. Service的每个Binder实体位于Service所属的进 ...

  4. [转]Android Binder设计与实现 - 设计篇

    摘要 Binder是Android系统进程间通信(IPC)方式之一.Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder ...

  5. 用C++开发Binder服务

    用C++来实现Binder服务比较麻烦,原因是没有AIDL的辅助,必须手工来写中间的代码. 首先写一个服务类ExampleServer的代码: class ExampleServer : public ...

  6. C++实例讲解Binder通信

    binder是android里面的通信机制,这就不说它如何如何好了,Goog已经说过了,这里不多说.binder是一个面向对象的编程方法,大量使用虚函数类.最近研究binder看到一网友写的,就借鉴一 ...

  7. 为什么使用Binder而不是其他IPC机制

    本文搬运自:Advantages of using Binder for IPC in Android 使用Binder而不是其他(Semaphores , Message Queue, PIPES) ...

  8. C++使用binder实例

    Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行的流程. ...

  9. LocalBroadcastManager 的实现原理,Handler还是 Binder?

    原文: http://www.trinea.cn/android/localbroadcastmanager-impl/ 对 LocalBroadcastManager 大家应该都不陌生,相对 Bro ...

  10. 浅谈android binder机制

    binder机制 是谷歌优化在android上更适合终端的IPC(多进程通信方式),满足系统对通信方式,传输性能和安全性的要求. 特性: 1. 用驱动程序来推进进程间的通信.2. 通过共享内存来提高性 ...

随机推荐

  1. 【javaScript】获取某年某月的的最后一天(即当月天数) 妙用

    javaScript里 面的new Date("xxxx/xx/xx")这个日期的构造方法有一个妙处,当你传入的是"xxxx/xx/0"(0号)的话,得到的日期 ...

  2. springboot中使用logback

    原文地址:https://blog.csdn.net/tianyaleixiaowu/article/details/73321610 Springboot默认集成的就是logback,logback ...

  3. linux 为动态分配的Virtualbox虚拟硬盘扩容

    如何为动态分配的Virtualbox虚拟硬盘扩容 查看虚拟硬盘是否是动态分配大小 打开虚拟机的设置界面,在左侧栏点击存储.在存储树下面选择你的虚拟硬盘.在右边可以看见虚拟硬盘的信息.在下面可以看见,我 ...

  4. 最新Pyecharts-基本图表

    Pyecharts是由Echarts而来,Echarts是百度开源的数据可视化的库,适合用来做图表设计开发,当使用Python与Echarts结合时就产生了Pyecharts.可使用pip安装,默认是 ...

  5. 'NoneType' object has no attribute shape

    使用cv2读取图片时,输出图片形状大小时出现报错“ 'NoneType' object has no attribute shape”,后来排查发现读取图片的返回值image为None, 这就说明图片 ...

  6. 自动化运维之Ansible入门

    Ansible简介 Ansible是什么? Ansible 简单的说是一个配置管理系统(ConfiGuration Management System).你只需要可以使用ssh访问你的服务器或设备.它 ...

  7. Dockers 部署 MongoDB + mongo-express

    1. 拉取 Mongo 镜像 docker pull mongo: 2.  运行镜像 docker run -d --name mongodb --volume /usr/local/mongodat ...

  8. discuz如何修改主题列表页增加最后发表用户调用

    首页有点问题,我觉得摘要实在太长了,我调整了一下 <!--{if is_array($group['lastpost'])}--> <a href="forum.php?m ...

  9. 暑假第三周总结(学习HDFS操作方法)

    本周由于自己出去玩,以及家里的各种事也没好好看书,就对HDFS的一些常用的shell命令进行了学习与应用,观看了林子雨老师关于HDFS的视频,对HDFS的一些存储的原理.规则进行了一定的了解.对uba ...

  10. sql中常量和变量的引用

    String name =jtf.getText().trim(); String sql="select * from stu where stuname='  "+name+& ...