Android IPC (跨线程调用)
来源:互联网 发布:linux系统安全配置 编辑:程序博客网 时间:2024/05/21 10:00
任神的书确实不错, 以IPC的角度把以前零碎的东西做一次复习,加深了理解。以下是读书笔记。
1.进程与线程
进程:android一般一个程序占有一个进程,但可以通过给四大组件指定android:process属性 开启单独,一个进程会运行在
线程: 在一个应用 中耗时操作一般要开启子线程去操作,也就是说一个进程可以有多个线程,它们之间是包含关系。
能够进行IPC的数据库型: 基本数据类型、Serializable 、 Parcelable
3.实现IPC的方式
1. 使用Bundle, 四大组线传通过intent传递bundle对象是可以实现跨线程传输的。2.使用文件共享, 把对象序列化到文件中,在其它线程中反序列化。比较重量级3. 使用Messenger(信使)4. 使用AIDL5. ContentProvider, 内容提供者是android提供不同应用 之前数据访问的方式。天生就是跨进程的通信。 6 使用Socket, socket在android中的使用与java中完全一样,可用于不同终端之前的通信, 跨进程更不在话下了。
这里主要介绍Messenger与AIDL的使用,两者一般都是用在service中
Messenger的底层实现也是aidl,它是android为我们提供的更加简化的方式。Messenger只能进行数据的传递,而不能进行方法的调用。
1.服务端程序如下, 通过OnBind方法把我们的Messager内部的Binder返回给客户端
public class MessengerService extends Service {private static class MessengerHandler extends Handler {@Overridepublic void handleMessage(Message msg) {if (msg.what == 1) {// System.out.println(msg.obj.toString());Bundle data = msg.getData(); System.out.println(data.getString("msg"));super.handleMessage(msg); } }private final Messenger mMessenger = new Messenger(new MessengerHandler());@Nullable @Overridepublic IBinder onBind(Intent intent) {return mMessenger.getBinder(); }}2.下面是客户端程序 public class MessengerActivity extends Activity{private ServiceConnection mConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {messenger = new Messenger(service); Message message = Message.obtain(); message.what = 1;// message.obj = "试试"; //message.obj传递对象装失效,但可以能过setDate传递BundleBundle data = new Bundle(); data.putString("msg", "helloworld"); message.setData(data);try {messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } }@Overridepublic void onServiceDisconnected(ComponentName name) { } };private Messenger messenger;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); }public void bind(View v) { Intent intent = new Intent(this, MessengerService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); }@Overrideprotected void onDestroy() { unbindService(mConnection);super.onDestroy(); }}
程序很简单,在service绑定成功后,通过new 一个Messenger并传递 binder对象,这样服务端与客户端随便是两个Messenger对象,但共有一个binder.最后调用messenger.sendDate方法传递数据给服务端。
下面让服务端接到消息后能再返回数据给客户端。改动代码如下
首先是客户端部分,要准备一个Messenger对象传递 给服务端
private Messenger replyMessenger = new Messenger(new MessengerHandler());private static class MessengerHandler extends Handler {@Overridepublic void handleMessage(Message msg) {if (msg.what == 1) { System.out.println(msg.getData().getString("msg")); }super.handleMessage(msg); }}然后把Messenger对象放入Bundle.replyTo中Bundle data = new Bundle();data.putString("msg", "helloworld");message.setData(data);//把messenger传递过去message.replyTo = replyMessenger;try {messenger.send(message);} catch (RemoteException e) { e.printStackTrace();}下面是服务端,拿到Messenger,并以同样的方式发送消息给客户端private static class MessengerHandler extends Handler {@Overridepublic void handleMessage(Message msg) {if (msg.what == 1) {// System.out.println(msg.obj.toString());Bundle data = msg.getData(); System.out.println(data.getString("msg")); Messenger client = msg.replyTo; Message replayMessage = Message.obtain(); replayMessage.what = 1; Bundle replyData = new Bundle(); replyData.putString("msg", "哈哈,,我已收到"); replayMessage.setData(replyData);try { client.send(replayMessage); } catch (RemoteException e) { e.printStackTrace(); } }super.handleMessage(msg); }}
这样完整的交互就完成了。
1 0
- Android IPC (跨线程调用)
- android ipc
- Android IPC
- Android IPC
- Android IPC
- Android IPC
- android IPC
- Android IPC
- 关于线程间IPC
- Android UI线程异步调用
- Android线程中调用接口
- IPC的调用步骤
- android IPC通信中的UID和PID识别(远程调用/本地调用)
- 跨线程调用控件
- C# 跨线程调用
- wxPython跨线程调用
- C#跨线程调用
- 跨线程调用问题
- Mysql查询语句性能优化
- Android ProgressLayout:加载页面遮挡耗时操作任务页面
- VMware安装增强功能实现共享文件夹和剪贴板
- python tornado coroutine 原理
- iOS 查找沙盒目录
- Android IPC (跨线程调用)
- AIDL权限验证
- 纽酷--键值对
- “互联网+”并非要干掉传统企业|“娃娃亲亲”创始人郑国新
- [OpenGL]利用OpenGL绘制一些简单的图形
- 纽酷--消息
- Android IPC-AIDL
- Cloudera manager API的坑
- 防止屏幕旋转时 Activity 重启