Android进程间通信IPC

来源:互联网 发布:网络高清录像机 编辑:程序博客网 时间:2024/05/22 09:00

这里写图片描述


1. 使用Bundle 传输数据

Android中的四大组件中,其中有三大组件(Activity,Service,Receiver)都支持Intent中传递Bundle数据,如果看其源码,会发现其也是实现了Parcelable接口,所以其能够在不同进程中传输。

2.文件共享

将对象序列化之后保存到文件中,在通过反序列,将对象从文件中读取。
/** * 写入序列化对象 */public void wirte() {    Book book = new Book();    book.bookId = 1;    book.bookName = "si";    try {        // 构造序列化输出字节流        ObjectOutputStream oos = new ObjectOutputStream(                new FileOutputStream(PATH));        // 序列化对象        oos.writeObject(book);        // 关闭流        oos.close();    } catch (Exception e) {        e.printStackTrace();    }    System.out.println(book);}
public void read() {    Book book = null;    try {        // 创建序列化读取字节流        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(                MainActivity.PATH));        // 反序列化(读取)对象        book = (Book) ois.readObject();        // 关闭流        ois.close();    } catch (Exception e) {        e.printStackTrace();    }    System.out.println(book);}

3. Messenger信使

服务端

  • 创建Service
  • 构造Handler对象,实现handlerMessage方法。
  • 通过Handler对象构造Messenger信使对象。
  • 通过Service的onBind()返回信使中的Binder对象。
  • public class MessengerService extends Service {    /**     * 构建handler 对象     */    public static Handler handler = new Handler(){        public void handleMessage(android.os.Message msg) {            // 接受客户端发送的消息            String msgClient = msg.getData().getString("msg");            Log.i("messenger","接收到客户端的消息--"+msgClient);        };    };    // 通过handler 构建Mesenger 对象    private final Messenger messenger = new Messenger(handler);    @Override    public IBinder onBind(Intent intent) {        // 返回binder 对象        return messenger.getBinder();    }}

客户端

  • 创建Actvity
  • 绑定服务
  • 创建ServiceConnection,监听绑定服务的回调。
  • 通过onServiceConnected()方法的参数,构造客户端Messenger对象
  • 通过Messenger向服务端发送消息。
  • public class MessengerActivity extends AppCompatActivity {    /**     * Messenger 对象     */    private Messenger mService;    private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            // IBinder 对象            // 通过服务端返回的Binder 对象 构造Messenger             mService = new Messenger(service);            Log.i("messenger", "客户端以获取服务端Messenger对象");        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_messenger);        // 启动服务        Intent intent = new Intent(this, MessengerService.class);        bindService(intent, conn, BIND_AUTO_CREATE);    }    /**     *  布局文件中添加了一个按钮,点击该按钮的处理方法     * @param view     */    public void send(View view) {        try {            // 向服务端发送消息            Message message = Message.obtain();            Bundle data = new Bundle();            data.putString("msg", "lalala");            message.setData(data);            // 发送消息            mService.send(message);            Log.i("messenger","向服务端发送了消息");        } catch (Exception e) {            e.printStackTrace();        }    }}

我们是通过Message作为媒介去携带数据的。但是,Message的obj 并没有实现序列化(实现Serializable或Parcelable),也就是其不能保存数据。必须使用message.setData()方法去传入一个Bundle对象,Bundle中保存需要传入的数据。


客户端向服务端发送消息

服务端: 

public class MessengerService extends Service {    /**     * 构建handler 对象     */    public static Handler handler = new Handler() {        public void handleMessage(android.os.Message msg) {            // 接受客户端发送的消息            String msgClient = msg.getData().getString("msg");            Log.i("messenger", "接收到客户端的消息--" + msgClient);            // 获取客户端Messenger 对象            Messenger messengetClient = msg.replyTo;            // 向客户端发送消息            Message message = Message.obtain();            Bundle data = new Bundle();            data.putString("msg", "ccccc");            message.setData(data);            try {                // 发送消息                messengetClient.send(message);            } catch (RemoteException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        };    };    // 通过handler 构建Mesenger 对象    private final Messenger messenger = new Messenger(handler);    @Override    public IBinder onBind(Intent intent) {        // 返回binder 对象        return messenger.getBinder();    }}

客户端

public class MessengerActivity extends AppCompatActivity {    /**     * Messenger 对象     */    private Messenger mService;    private ServiceConnection conn = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            // IBinder 对象            // 通过服务端返回的Binder 对象 构造Messenger            mService = new Messenger(service);            Log.i("messenger", "客户端以获取服务端Messenger对象");        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_messenger);        // 启动服务        Intent intent = new Intent(this, MessengerService.class);        bindService(intent, conn, BIND_AUTO_CREATE);    }    /**     *  布局文件中添加了一个按钮,点击该按钮的处理方法     * @param view     */    public void send(View view) {        try {            // 向服务端发送消息            Message message = Message.obtain();            Bundle data = new Bundle();            data.putString("msg", "lalala");            message.setData(data);            // ----- 传入Messenger 对象            message.replyTo = messengerClient;            // 发送消息            mService.send(message);            Log.i("messenger","向服务端发送了消息");        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 构建handler 对象     */    public static Handler handler = new Handler(){        public void handleMessage(android.os.Message msg) {            // 接受服务端发送的消息            String msgService = msg.getData().getString("msg");            Log.i("messenger","接收到服务端的消息--"+msgService);        };    };    // 通过handler 构建Mesenger 对象    private final Messenger messengerClient = new Messenger(handler);}

4.AIDL

5.ContentProvider

6.Socket


转载:http://blog.csdn.net/jdsjlzx/article/details/51973813