当前位置: 代码迷 >> Android >> Android开发之Service透过Messenger实现线程间的通信
  详细解决方案

Android开发之Service透过Messenger实现线程间的通信

热度:69   发布时间:2016-04-28 06:10:14.0
Android开发之Service通过Messenger实现线程间的通信

        Messenger信使其实在真正使用中用到的并不多,但是面试的时候考官还是十分想要考察一下你的基本功的。那我们现在先来看一下Messenger的使用场景。如果你需要你的Service与远程线程通信,那么您可以使用一个Messenger来为您的Service提供的接口。这种技术允许您执行进程间通信(IPC),而不需要使用AIDL。那关于Messenger的使用有哪些基本总结呢。(1)在Service中,必须继承一个Handler类,来处理回调信息 (2)Messenger类创建的时候所传的参数就是之前提到的我们实现的Handler类(3)在Service 的onbind()方法中返回Messenger.getBind()方法(4)Service接收到的每条信息都是通过handlerMessage()方法处理的。啰嗦了那么多还是来看一下代码吧。

MainActivity的代码

package com.example.f24_service03;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.view.View;public class MainActivity extends Activity {	private boolean flag = false;	private Messenger messenger;	public void sayHello(View v) {		if (!flag)			return;		// Create and send a message to the service, using a supported 'what'		// value		Message msg = Message.obtain(null, 1, 0, 0);		try {			messenger.send(msg);		} catch (RemoteException e) {			e.printStackTrace();		}	}	ServiceConnection connection = new ServiceConnection() {		@Override		public void onServiceDisconnected(ComponentName name) {			// TODO Auto-generated method stub			messenger = null;			flag = false;		}		@Override		public void onServiceConnected(ComponentName name, IBinder service) {			// TODO Auto-generated method stub			//当绑定成功时,我们就可以用Messenger来实现线程间的通信			messenger = new Messenger(service);			flag = true;		}	};	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);	}	protected void onStart() {		Intent intent = new Intent(this, MyService.class);		bindService(intent, connection, BIND_AUTO_CREATE);		super.onStop();	};	@Override	protected void onStop() {		// TODO Auto-generated method stub		if (flag) {			unbindService(connection);			flag = false;		}		super.onStop();	}}

MyService的代码

package com.example.f24_service03;import android.annotation.SuppressLint;import android.app.Service;import android.content.Intent;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.util.Log;import android.widget.Toast;public class MyService extends Service {	@SuppressLint("HandlerLeak")	// 该类处理从客户端传入的信息	 class incomingHandler extends Handler {		@Override		public void handleMessage(Message msg) {			// TODO Auto-generated method stub			if (msg.what == 1) {				Toast.makeText(getApplicationContext(),						"Hello ,already recieve Message", Toast.LENGTH_LONG)						.show();			}			super.handleMessage(msg);		}	}	final Messenger messenger = new Messenger(new incomingHandler());	// 当绑定Service,我们将返回一个Messenger通讯接口	@Override	public IBinder onBind(Intent intent) {		// TODO Auto-generated method stub		Log.i("Service", "-------->bind");		return messenger.getBinder();	}}


  相关解决方案