不需要AIDL也不需要复杂的ContentProvider,也不需要SharedPreferences或者共享存储文件! 只需要简单易懂的Messenger,它也称为信使,通过它可以在不同进程中传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通讯和传递数据。废话不多说,直接上代码。 首先是服务端: public class Ser extends Service{ @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } @Override publ 在Android开发中,跨进程通信(IPC,Inter-Process Communication)是系统中不同应用程序之间进行交互的重要手段。本文将深入探讨一种简洁易懂的跨进程通信方式——使用Messenger。Messenger基于Handler机制,允许应用程序在不同的进程中传递Message对象,进而实现数据的传输。 我们从服务端开始讲解。在服务端,我们创建一个名为Ser的Service,继承自Service类。在onBind()方法中返回Messenger的Binder对象,这是客户端与服务端建立连接的关键。同时,我们还需要定义一个内部类MyHandler,继承自Handler,用于处理客户端发来的Message。在handleMessage()方法中,我们可以获取到Message对象中的数据并作出相应的处理,比如在这里,我们将接收到的数据打印出来,并通过replyTo字段的Messenger对象回传一条新的Message给客户端。 ```java public class Ser extends Service { public Messenger messenger = new Messenger(new MyHandler()); public class MyHandler extends Handler { @Override public void handleMessage(Message msg) { // 处理接收到的Message } } @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); } } ``` 然后,我们转向客户端。同样地,我们也创建一个Service,名为Client,但这个Service主要用于与服务端进行通信。客户端需要绑定到服务端的Service,为此,我们需要创建一个ServiceConnection对象。在onServiceConnected()方法中,我们会得到服务端的IBinder,通过它创建一个新的Messenger对象,用于向服务端发送Message。 ```java public class Client extends Service { private Messenger mService; private Messenger messenger = new Messenger(handler); @Override public int onStartCommand(Intent intent, int flags, int startId) { Intent mIntent = new Intent(); mIntent.setClassName("com.example.test1", "com.example.test1.Ser"); bindService(mIntent, mBindService, Context.BIND_AUTO_CREATE); return super.onStartCommand(intent, flags, startId); } private ServiceConnection mBindService = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); // 发送消息到服务端 } }; } ``` 客户端通过messenger对象发送消息时,通常会创建一个Message对象,设置好需要传递的数据(如使用Bundle对象),并指定服务端应调用哪个Handler来处理这个Message。例如,我们可以将一个字符串数据放入Bundle,并设置Message的what字段作为处理标识。 ```java Message msg = Message.obtain(); msg.what = 1; // 指定处理的标识 Bundle data = new Bundle(); data.putString("msg", "这是客户端发送的消息"); msg.setData(data); try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } ``` 服务端的MyHandler会根据Message的what字段来决定如何处理Message,从而实现双向通信。当服务端收到Message并处理完毕后,可以通过replyTo字段的Messenger回传数据给客户端。 Messenger提供了一种轻量级的跨进程通信方式,它简化了AIDL(Android Interface Definition Language)等复杂接口的使用,适用于简单场景下的数据交换。通过Handler和Message的配合,开发者可以方便地在不同的进程中传递数据,实现应用程序之间的交互。然而,需要注意的是,由于Messenger基于序列化机制,因此传递的数据类型有限,不能传递大对象或自定义类,对于更复杂的跨进程通信需求,可能需要考虑其他方法,如AIDL或使用BroadcastReceiver等。
- 粉丝: 8
- 资源: 940
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助