activity与service使用Messenger通信.doc_第1页
activity与service使用Messenger通信.doc_第2页
activity与service使用Messenger通信.doc_第3页
activity与service使用Messenger通信.doc_第4页
activity与service使用Messenger通信.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 HandlerOverridepublic void handleMessage(Message msg) / TODO Auto-generated method stubBundle 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(R.pute); bindButton.setOnClickListener(new View.OnClickListener()Overridepublic 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()Overridepublic void onClick(View v) if(isBound)isBound = false;unbindService(mConnection); ); computButton.setOnClickListener(new View.OnClickListener()Overridepublic 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 blocke.printStackTrace();elselabelView.setText(没有启动服务!); ); private ServiceConnection mConnection = new ServiceConnection() Overridepublic void onServiceConnected(ComponentName name, IBinder service) Log.i(Service, onServiceConnected);sMessenger=new Messenger(service);Overridepublic void onServiceDisconnected(ComponentName name) sMessenger=null;Log.i(Service, onServiceDisconnected); ;Overridepublic boolean bindService(Intent service, ServiceConnection conn, int flags) / TODO Auto-generated method stubLog.i(Service, bindService);return super.bindService(service, conn, flags); Service中的代码:public class MathService extends Serviceprivate final Messenger sMessenger = new Messenger(new ServiceHandle();public Messenger aMessenger=null;public class ServiceHandle extends HandlerOverridepublic void handleMessage(Message msg) / TODO Auto-generated method stubBundle 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 blocke.printStackTrace();super.handleMessage(msg);public class LocalBinder extends BinderMathService getService() return MathService.this; Overridepublic IBinder onBind(Intent intent) Toast.makeText(this, 本地绑定:MathService, Toast.LENGTH_SHORT).show(); Log.i(Service, onBind);return sMessenger.getBinder();Overridepublic boolean onUnbind(Intent intent) Toast.makeText(this, 取消本地绑定:MathService, Toast.LENGTH_SHORT).show(); Log.i(Service, onUnbind);return false;Overridepublic void onCreate() / TODO Auto-generated method stubsuper.onCreate();Log.i(Service, onCreat);Overridepublic void onDestroy() / TODO Auto-generated method stubsuper.onDestroy();Log.i(Service, onDestroy);Overridepublic void onRebind(Intent intent) / TODO Auto-generated method stubsuper.onRebind(intent);Log.i(Service, onRebind);Overridepublic void onStart(Intent intent, int startId) / TODO Auto-generated method stubsuper.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对象和S

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论