新建service进程
<service android:name=".messenger.MessengerService"
android:process=":remote"
></service>
service代码如下
public class MessengerService extends Service {
//
private Messenger messenger = new Messenger(new MessengerHandler());
//用来处理客户端发来的信息
class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("Tag" , "service revice msg.what : " + msg.what);
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
//返回Messenger对象底层的Binder
return messenger.getBinder();
}
}
客户端代码如下:
public class MainActivity extends AppCompatActivity {
private int i = 0;
private Messenger serverMessenger;
//service连接对象
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("tag" , "onServiceConnected");
//构建service端Messenger
serverMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this , MessengerService.class);
//绑定service
bindService(intent , connection , Context.BIND_AUTO_CREATE);
}
public void click(View view) {
Message msg = Message.obtain();
msg.what = i;
try {
//发送信息到服务端
serverMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
i++;
}
@Override
protected void onDestroy() {
//解除service绑定
unbindService(connection);
super.onDestroy();
}
}
此时启动项目即可在service端收到Activity发送来的信息
接下里准备在service中收到信息后回复Activity
可以发现在Message中replyTo属性类型为Messenger,这就是用来做返回用的
我们可以在Activity中创建一个Messenger,并且在发送Message到Service时,在Message中将Activity创建的Messenger放入发送的Message.replyTo中,之后便可在service中取出,再用其返回数据给Activity。
修改Activity代码,添加Messenger:
private Messenger serverMessenger,clientMessenger;
//用来操作service返回的数据
private static class ClientHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("tag" , "client revice msg.what :" + msg.what);
}
}
public void click(View view) {
Message msg = Message.obtain();
//将Messenger放入要发送的信息中
msg.replyTo = clientMessenger;
msg.what = i;
try {
serverMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
i++;
}
修改service代码,取出Message中Activity发来的Messenger,用其便可回复Activity:
//Activity发送过来的Messenger
private Messenger clientMessenger;
//用来处理Activity发送来的信息
class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("Tag" , "service revice msg.what : " + msg.what);
//取出客服端发送过来的Messenger
if(msg.replyTo != null){
clientMessenger = msg.replyTo;
}
//新建回复消息
Message retMsg = Message.obtain();
retMsg.what = msg.what + 100000;
try {
//回复Activity
clientMessenger.send(retMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
运行程序即可在service中收到Activity发送来的信息,且可在Activity中收到service回复的信息
完整Activity代码如下:
public class MainActivity extends AppCompatActivity {
private int i = 0;
private Messenger serverMessenger,clientMessenger;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("tag" , "onServiceConnected");
serverMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(this , MessengerService.class);
bindService(intent , connection , Context.BIND_AUTO_CREATE);
clientMessenger = new Messenger(new ClientHandler());
}
public void click(View view) {
Message msg = Message.obtain();
msg.replyTo = clientMessenger;
msg.what = i;
try {
serverMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
i++;
}
@Override
protected void onDestroy() {
unbindService(connection);
super.onDestroy();
}
private static class ClientHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("tag" , "client revice msg.what :" + msg.what);
}
}
}
完整service代码如下:
public class MessengerService extends Service {
private Messenger messenger = new Messenger(new MessengerHandler());
private Messenger clientMessenger;
class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.e("Tag" , "service revice msg.what : " + msg.what);
if(msg.replyTo != null){
clientMessenger = msg.replyTo;
}
Message retMsg = Message.obtain();
retMsg.what = msg.what + 100000;
try {
clientMessenger.send(retMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}