所谓的信使就是Messenger,它的作用是建立不同应用之间客户端和服务端的连接,并进而实现信息的传递。
对于服务端信使的创建:
①创建一个Handler对象handler
②创建一个信使对象Messenger messenger = new Messenger(handler);
③在onBind方法中通过调用messenger对象的getBinder()方法返回一个IBinder对象
④注册服务并添加Action
接下来是在第二个Android项目中获取服务端中创建的信使,并通过该信使给服务端发送消息。
好了,下面我们看代码吧。
第一个项目中的MyService:
package com.example.text05;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Messenger;
import android.util.Log;
public class MyService extends Service {
// 创建Handler对象
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
//获取Message中的值
int number = msg.arg1;
Bundle bundle = msg.getData();
String info = bundle.getString("info");
Log.i("main", number + "--->" + info);
};
};
// 创建一个信使对象
Messenger messenger = new Messenger(handler);
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}
在清单文件中注册:
<service android:name="com.example.text05.MyService" >
<intent-filter>
<action android:name="com.example.messenger" />
</intent-filter>
</service>
在第二个MainActivity中的实现:
package com.example.text06;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.util.Log;
import android.view.View;
public class MainActivity extends Activity {
private MyServiceConn conn;
//创建信使对象用来接受服务端返回的Bind对象
private Messenger messenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
conn = new MyServiceConn();
// 声明Intent
Intent intent = new Intent("com.example.messenger");
// 绑定服务
boolean flag = bindService(intent, conn, BIND_AUTO_CREATE);
Log.i("main", "绑定是否成功" + flag);
}
class MyServiceConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 服务端:IBinder binder = messenger.getBinder();
// 能不能通过参数service创建一个Messenger对象
messenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}
public void send(View view) {
//声明一个Message消息对象
Message msg = Message.obtain();
msg.arg1 = 100;
//这里是不能直接传字符串的,因为字符串String实现的是Serializable接口而不是Parcelable接口
//所以会出现异常,因为信使中如果传递对象则必须实现Parcelable接口,如果必须传递字符串考虑使用Bundle
// msg.obj = "你好,我来自客户端";
Bundle bundle = new Bundle();
bundle.putString("info", "你好,我来自客户端");
msg.setData(bundle);
try {
//通过信使传递消息
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
运行结果:这里是通过点击客户端给服务端发送消息,下面是Log输出