收藏 分销(赏)

activity与service使用Messenger通信.doc

上传人:仙人****88 文档编号:12072134 上传时间:2025-09-06 格式:DOC 页数:6 大小:53.50KB 下载积分:10 金币
下载 相关 举报
activity与service使用Messenger通信.doc_第1页
第1页 / 共6页
activity与service使用Messenger通信.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
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
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服