基于Message的跨进程通信

转载自
http://blog.csdn.net/lmj623565791/article/details/47017485

模拟两个应用进行交互,

1 新编写一个应用不做任何界面操作仅仅只是作为一个开启service的功能。
1.1新建一个自定义service

public class MessengerService extends Service

1.2 覆盖父类的handleMessage方法,在这个方法自定义自已想要做的操作

public void handleMessage(Message msgfromClient) {
            Message msgToClient = Message.obtain(msgfromClient);
            switch (msgfromClient.what) {
            case MSG_SUM:
                msgToClient.what = MSG_SUM;
                try {
                Thread.sleep(2000);
                msgToClient.arg2=msgfromClient.arg1+msgfromClient.arg2;
                msgfromClient.replyTo.send(msgToClient);
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
                break;

            default:
                break;
            }

        };
    });
1.3重写 onBind方法
public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return mMessenger.getBinder();
    }
1.4 在这里实现service的静态注册
<service android:name=".MessengerService"
            android:enabled="true"
            android:exported="true">
            <intent-filter >
                <action android:name="com.ken.aidl.calc"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </service>
这里的action是自定义的相当于一个标识符的存在,与另一个应用的标识符相对应。


2新建另外一个要进行展示的APP
从客户端绑定到一个service的步骤
①实现ServiceConnection并且重写它的两个方法
private ServiceConnection mConn = new ServiceConnection()
    {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service)
        {
        //在onServiceConnected中拿到回调的service(IBinder)对象,通过service对象去构造一个 mService =new Messenger(service);然后就可以使用mService.send(msg)给服务端了。
            mService = new Messenger(service);
            isConn = true;
            mTvState.setText("connected!");
        }

        @Override
        public void onServiceDisconnected(ComponentName name)
        {
            mService = null;
            isConn = false;
            mTvState.setText("未连接!");
        }
    };
    ②调用启动服务的方法
    private void bindServiceInvoked()
    {
        Intent intent = new Intent();
        intent.setAction("com.zhy.aidl.calc");
        bindService(intent, mConn, Context.BIND_AUTO_CREATE);
        Log.e(TAG, "bindService invoked !");
    }
然后在btn点击事件中发送数据到先前app
    private int mA;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //开始绑定服务
        bindServiceInvoked();

        mTvState = (TextView) findViewById(R.id.id_tv_callback);
        mBtnAdd = (Button) findViewById(R.id.id_btn_add);
        mLyContainer = (LinearLayout) findViewById(R.id.id_ll_container);

        mBtnAdd.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                try
                {
                    int a = mA++;
                    int b = (int) (Math.random() * 100);

                    //创建一个tv,添加到LinearLayout中
                    TextView tv = new TextView(MainActivity.this);
                    tv.setText(a + " + " + b + " = caculating ...");
                    tv.setId(a);
                    mLyContainer.addView(tv);

                    Message msgFromClient = Message.obtain(null, MSG_SUM, a, b);
                    msgFromClient.replyTo = mMessenger;
                    if (isConn)
                    {
                        //往服务端发送消息
                        mService.send(msgFromClient);
                    }
                } catch (RemoteException e)
                {
                    e.printStackTrace();
                }
            }
        });

    }
在对方app的service接到消息进行处理后会返回给Client端的mMessenger,然后由handleMessage方法进行处理private Messenger mMessenger = new Messenger(new Handler()
    {
        @Override
        public void handleMessage(Message msgFromServer)
        {
            switch (msgFromServer.what)
            {
                case MSG_SUM:
                    TextView tv = (TextView) mLyContainer.findViewById(msgFromServer.arg1);
                    tv.setText(tv.getText() + "=>" + msgFromServer.arg2);
                    break;
            }
            super.handleMessage(msgFromServer);
        }
    });
最后在该界面消失的时候接触绑定
    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        unbindService(mConn);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值