好记性不如铅笔头

android, 编程

Android应用开发笔记:使用Messenger与Service通讯

最近在查找资料时,发现了一个一直没有注意的知识点,通过Messenger来进行通讯,这里简单的备份下。

Messenger有两个构造函数,参考androidsdk【 http://developer.android.com/reference/android/os/Messenger.html 】

因此,可以通过onServiceConnected的返回值构造,也可以通过handler构造。

CONTENTS

个人总结的Messenger的使用步骤如下:

1)Activity和Service中各自声明两个Messenger,其中一个Messenger通过本地的handler构造,另一个为NULL。

2)Activity和Service绑定后,Activity可以通过onServiceConnected的参数构造第二个Messenger。

3)绑定后,Activity向Service发送消息,消息中将本地的Messenger送给Service来保存。

说起来比较绕,代码如下:

github:

https://github.com/cstriker1407/android/tree/master/MessengerService 】

MainActivity:

public class MainActivity extends Activity {
	private class ActivityHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			Log.d("activity", msg.toString());
		}
	}

	private Messenger mServiceMessenger = null;
	private Messenger mActivityMessenger = new Messenger(new ActivityHandler());

	private ServiceConnection mConnection = new ServiceConnection() {
		public void onServiceConnected(ComponentName className, IBinder service) {
			mServiceMessenger = new Messenger(service);

			Message msgToService = new Message();
			msgToService.replyTo = mActivityMessenger;
			msgToService.obj = "this is from activiyt";

			try {
				mServiceMessenger.send(msgToService);
			} catch (RemoteException e) {
				e.printStackTrace();
			}

		}

		public void onServiceDisconnected(ComponentName className) {
			mServiceMessenger = null;
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	@Override
	protected void onStart() {
		super.onStart();
		// 绑定到service
		bindService(new Intent(this, MessengerService.class), mConnection,
				Context.BIND_AUTO_CREATE);
	}

	@Override
	protected void onStop() {
		super.onStop();
		unbindService(mConnection);
	}
}

MessengerService:

public class MessengerService extends Service 
{
    
	private class ServiceHandler extends Handler 
	{
        @Override
        public void handleMessage(Message msg)
        {
        	Log.d("Service", msg.toString());
        	mActivityMessenger = msg.replyTo;
        	
            Message msgToAct = new Message();
            msgToAct.obj = "this is from service";
        	try
			{
        		mActivityMessenger.send(msgToAct);
			}
			catch (RemoteException e)
			{
				e.printStackTrace();
			}
        }
    }
    private Messenger mServiceMessenger = new Messenger(new ServiceHandler());
    private Messenger mActivityMessenger = null;
    
    @Override
    public IBinder onBind(Intent intent) {
        Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
        return mServiceMessenger.getBinder();
    }
}

 备注:

1)Messenger可以支持跨进程通讯,也就是说可以替代AIDL,这一点作者没有测试过。

2)Messenger有个明显的好处,Service可以通过Messenger发送消息直接和Activity通讯。

发表评论

1 × 2 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据