直奔主题!
服务端 :这里用一个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);
}
}
- 效果图