资源描述
Android开发——Activity与service使用Messenger通信
Messenger对象可以发送Message,送出的消息放在消息池中,由主线程依次取出,交给和Message关联的Handle处理,而Messenger可以在创建时和Handle对象关联,所以由哪个Messenger发出的Message,就可以由和这个Messenger关联的Handle处理。所以为了实现Activity和Service的通信,我们可以在Activity和Service中分别定义一个Handle类,用来处理和这个Handle相关联的Messenger发出的Message。并且用这个类对象去创建Messenger对象。
具体例子如下:
Activity的代码
public class SimpleMathServiceDemo extends Activity {
//private MathService mathService;
private Messenger sMessenger=null;
private boolean isBound = false;
TextView labelView;
private final Messenger aMessenger=new Messenger(new ActivityHandle());
class ActivityHandle extends Handler{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Bundle bundle=new Bundle();
bundle=msg.getData();
labelView.setText(bundle.getCharSequence("fromservice"));
super.handleMessage(msg);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
labelView = (TextView)findViewById(R.id.label);
Button bindButton = (Button)findViewById(R.id.bind);
Button unbindButton = (Button)findViewById(R.id.unbind);
Button computButton = (Button)findViewById(Rpute);
bindButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(!isBound){
final Intent serviceIntent = new Intent(SimpleMathServiceDemo.this,MathService.class);
bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);
isBound = true;
}
}
});
unbindButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(isBound){
isBound = false;
unbindService(mConnection);
}
}
});
computButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(sMessenger!=null){
try {
Bundle bundle=new Bundle();
bundle.putString("fromActivity", "从Activity发向Service");
Message msg=Message.obtain();
msg.setData(bundle);
msg.replyTo=aMessenger;
sMessenger.send(msg);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
labelView.setText("没有启动服务!");
}
}
});
}
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("Service", "onServiceConnected");
sMessenger=new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
sMessenger=null;
Log.i("Service", "onServiceDisconnected");
}
};
@Override
public boolean bindService(Intent service, ServiceConnection conn, int flags) {
// TODO Auto-generated method stub
Log.i("Service", "bindService");
return super.bindService(service, conn, flags);
}
}
Service中的代码:
public class MathService extends Service{
private final Messenger sMessenger = new Messenger(new ServiceHandle());
public Messenger aMessenger=null;
public class ServiceHandle extends Handler{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Bundle bundle=new Bundle();
bundle=msg.getData();
aMessenger=msg.replyTo;
Toast.makeText(MathService.this, bundle.get("fromActivity").toString(),
Toast.LENGTH_LONG).show();
Bundle bundle1=new Bundle();
bundle1.putString("fromservice", "从service到activity");
Message msg1=Message.obtain();
msg1.setData(bundle1);
try {
aMessenger.send(msg1);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.handleMessage(msg);
}
}
public class LocalBinder extends Binder{
MathService getService() {
return MathService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(this, "本地绑定:MathService",
Toast.LENGTH_SHORT).show();
Log.i("Service", "onBind");
return sMessenger.getBinder();
}
@Override
public boolean onUnbind(Intent intent){
Toast.makeText(this, "取消本地绑定:MathService",
Toast.LENGTH_SHORT).show();
Log.i("Service", "onUnbind");
return false;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.i("Service", "onCreat");
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("Service", "onDestroy");
}
@Override
public void onRebind(Intent intent) {
// TODO Auto-generated method stub
super.onRebind(intent);
Log.i("Service", "onRebind");
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
Log.i("Service", "onStart");
}
}
例中,Activity中定义了ActivityHandle类,并重载了public void handleMessage(Message msg)方法用来处理和该Handle关联的消息。
并通过private final Messenger aMessenger=new Messenger(new ActivityHandle());创建了Activity的数据成员aMessenger,如果Service能获取aMessenger对象,那么就可以利用它给Activity传递消息了。
同样,Service中也定义了ServiceHandle类,并通过private final Messenger sMessenger=new Messenger(new ServiceHandle());创建了Service的数据成员sMessenger,如果Activity能获取sMessenger对象,那么就可以利用它给Service传递消息了。
那么Activity如何获取Service的Messenger呢,它是通过Activity调用Service过程中传递过来的参数IBinder对象,通过构造方法创建的sMessenger对象,其中IBinder对象和Service中的sMessenger关联。而Activity在使用sMessenger发送Message对象时,先设置Message对象的Replyto属性为aMessenger,那么Service在收到消息进行处理时,就可以通过消息中的Replyto属性获取Activity中aMessenger对象,使用它就可以向Activity发送消息了。
Activity和Service通信是为了传递数据,数据是打包在Bundle对象中,再放进Message中的,具体用法可以通过代码去理解。
6
展开阅读全文