Android进程间通信IPC

这里写图片描述


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值