IPC-进程间通信(一)Messager

来源:互联网 发布:itunes软件下载 编辑:程序博客网 时间:2024/05/16 09:50

直奔主题!

服务端 :这里用一个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