美文网首页
IPC—Messenger

IPC—Messenger

作者: 要学的东西太多了 | 来源:发表于2018-09-19 15:38 被阅读0次

    1.Messenger进程间通信时,bundle有Parcelable对象解析数据的时候,需要调用bundle.setClassLoader方法,否则可能出现类型转换异常,因为bundle在调用getXXX解析数据的时候,调用Parcelable的readParcelable方法,readParcelableCreator会判断传入的ClassLoader是否为空,为空是使用的是Parcel的ClassLoader,用来加载我们自定义的类就会报错。

    示例:

    客户端代码:

    public class ClientActivity extends AppCompatActivity implements View.OnClickListener {
        private static final String TAG = "ClientActivity";
        @BindView(R.id.send)
        Button send;
        private Messenger sendMessager;
        private Intent intent;
    
        private Messenger getMessenger = new Messenger(new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Bundle bundle = msg.getData();
                bundle.setClassLoader(getClass().getClassLoader());//防止出现无法识别object的异常
                Log.d(TAG, "收到服务端消息: " + bundle.getString("rp"));
            }
        });
    
        private ServiceConnection serviceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                sendMessager = new Messenger(service);
                Message message = Message.obtain(null, 0);
                Bundle bundle = new Bundle();
                Data data = new Data();
                data.setAddress("天安门");
                data.setName("张三");
                data.setBankCard("6221889292992922");
                data.setBankOrg("中国农业银行");
                data.setEmail("1818181919@qq.com");
                data.setHeight(1.82);
                data.setIdCard("828992988889999X");
                data.setNation("汉");
                data.setOld(38);
                data.setPhone("18929929922");
                data.setQqNum("982892992");
                data.setSex("男");
                data.setWeight(148.2);
                bundle.putParcelable("data", data);
                message.setData(bundle);
                message.replyTo = getMessenger;//带上客户端监听
                try {
                    sendMessager.send(message);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_client);
            ButterKnife.bind(this);
            intent = new Intent(this, ServerService.class);
            send.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            Log.d(TAG, "onClick: 准备发送");
            try {
                unbindService(serviceConnection);
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
        }
    
        @Override
        protected void onDestroy() {
            unbindService(serviceConnection);
            super.onDestroy();
        }
    }
    

    服务端代码:

    public class ServerService extends Service {
        private static final String TAG = "ServerService";
        private Messenger messenger = new Messenger(new MsgHandler());
    
        private class MsgHandler extends Handler{
            @Override
            public void handleMessage(Message msg) {
                Bundle bundle = msg.getData();
                bundle.setClassLoader(getClass().getClassLoader());
                Data data = bundle.getParcelable("data");
                Log.d(TAG, "来自客户端的消息: "+data.toString());
                Messenger client = msg.replyTo;
                Message message = Message.obtain(null,1);
                Bundle bundle1=new Bundle();
                bundle1.putString("rp","收到了!");
                message.setData(bundle1);
                try {
                    client.send(message);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            return messenger.getBinder();
        }
    }
    

    AndroidManifest声明:

    <activity android:name=".process_communication.messager.ClientActivity" />
    <service
         android:name=".process_communication.messager.ServerService"
         android:enabled="true"
         android:exported="true"
         android:process=":server" />
    

    相关文章

      网友评论

          本文标题:IPC—Messenger

          本文链接:https://www.haomeiwen.com/subject/jjuinftx.html