基于Message的跨进程通信

来源:互联网 发布:linux查找指定文件 编辑:程序博客网 时间:2024/05/30 23:06

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

模拟两个应用进行交互,

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

public class MessengerService extends Service1.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