IPC-进程间通信(一)Messager

直奔主题!

服务端 :这里用一个service模拟一个进程(用两个apk也行)

  • 创建一个service(服务端)
public class WolfService extends Service {}
  • 在service内部创建一个handler
 private final static Handler handler = new Handler() {}
  • 创建一个Messager,并把handler放入其中
 private final static Messenger messenger = new Messenger(handler);
  • 重写onbind方法,返回messager里的binder

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //返回messager里的bindler
        return messenger.getBinder();
    }
  • 服务端完整代码:WolfService.java
public class WolfService extends Service {
    private static final int MSG_SUM = 0x110;

    private final static Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msgfromClient) {

            Message msgToClient = Message.obtain(msgfromClient);//返回给客户端的消息
            switch (msgfromClient.what) {
                //msg 客户端传来的消息
                case MSG_SUM:
                    msgToClient.what = MSG_SUM;
                    try {
                        //模拟耗时
                        Thread.sleep(2000);
                        msgToClient.arg2 = msgfromClient.arg1 + msgfromClient.arg2;
                        //replyTo是关键代码(把消息返还给客户端)
                        msgfromClient.replyTo.send(msgToClient);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    break;
            }
            super.handleMessage(msgfromClient);
        }
    };
    /**
     * 把handler传入Messager中
     */
    private final static Messenger messenger = new Messenger(handler);

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //返回messager里的bindler
        return messenger.getBinder();
    }
}
  • 清单文件中配置
 <service android:name="wolf.ipc_messager.server.WolfService"
            android:process=":wolf6666">
            <intent-filter>
                <action android:name="wolf.wolf"></action>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
           </service>

-运行程序 确认程序是否是两个进程

这里写图片描述

//清单文件配置的这个属性,就是说明这个service作为一个进程存在
android:process=":wolf6666"

客户端

  • 第一步就是绑定服务
 Intent intent= new Intent(MainActivity.this, WolfService.class);
 intent.setAction("wolf.wolf");
 connection = new WolfServiceConnection();
 bindService(intent, connection,  Context.BIND_AUTO_CREATE);

注意:不要忘了在ondestroy解绑

 unbindService(connection);
  • 写一个内部类实现ServiceConnection
class WolfServiceConnection implements ServiceConnection {
 @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
    //其实在这里已经可以想服务端发送消息了


        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }}

到这一步其实已经可以想服务端发送消息实现通信了,但这样只是单向通信,我们需要的是双向通信,所以在客户端也需要一个handler和messager

  • 创建handler和messager,并把handler放入messager
 private Messenger mMessenger = new Messenger(new Handler()
    {
        @Override
        public void handleMessage(Message msgFromServer)
        {          
            super.handleMessage(msgFromServer);
        }
    });
  • 客户端完整代码:Mainactivity.java
public class MainActivity extends AppCompatActivity {

    private Button btn1;
    private WolfServiceConnection connection;
    private TextView tv;
    private TextView tv2;
    private Messenger mService;

    class WolfServiceConnection implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = new Messenger(service);
            tv2.setText("连接成功");

        }
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
            tv2.setText("disconnected!");
        }
    }
    private int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //绑定服务
        Intent  intent = new Intent(MainActivity.this, WolfService.class);
        intent.setAction("wolf.wolf");
        connection = new WolfServiceConnection();
        bindService(intent, connection,  Context.BIND_AUTO_CREATE);

        btn1 = (Button) findViewById(R.id.button);
        tv = (TextView) findViewById(R.id.textView);
        tv2 = (TextView) findViewById(R.id.textView2);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //这里再点击事件中发送消息
                       int a = i++;
                       int b = (int) (Math.random() * 100);
                       tv.setText(" messager: "+a + " + " + b + " =");
                       try {
                           Message msgFromClient = Message.obtain(null, MSG_SUM,a,b);
                           msgFromClient.replyTo = mMessenger;
                           mService.send(msgFromClient);
                       } catch (Exception e) {
                           e.printStackTrace();
                       }
            }
        });
    }
    private static final int MSG_SUM = 0x110;
    private Messenger mMessenger = new Messenger(new Handler()
    {
        @Override
        public void handleMessage(Message msgFromServer)
        {
            switch (msgFromServer.what)
            {
                case MSG_SUM:
                    tv.setText(tv.getText() + "=>" + msgFromServer.arg2);
                    break;
            }
            super.handleMessage(msgFromServer);
        }
    });
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }

}
  • 效果图
    这里写图片描述

demo:http://download.csdn.net/detail/qq_34501274/9813323

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值