Android服务之信使

所谓的信使就是Messenger,它的作用是建立不同应用之间客户端和服务端的连接,并进而实现信息的传递。

对于服务端信使的创建:

①创建一个Handler对象handler

②创建一个信使对象Messenger messenger = new  Messenger(handler);

③在onBind方法中通过调用messenger对象的getBinder()方法返回一个IBinder对象

④注册服务并添加Action

接下来是在第二个Android项目中获取服务端中创建的信使,并通过该信使给服务端发送消息。

好了,下面我们看代码吧。

第一个项目中的MyService:

package com.example.text05;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Messenger;
import android.util.Log;

public class MyService extends Service {

	// 创建Handler对象
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			//获取Message中的值
			int number = msg.arg1;
			Bundle bundle = msg.getData();
			String info = bundle.getString("info");
			Log.i("main", number + "--->" + info);
			
		};
	};
	// 创建一个信使对象
	Messenger messenger = new Messenger(handler);

	@Override
	public IBinder onBind(Intent intent) {

		return messenger.getBinder();
	}

}
在清单文件中注册:

<service android:name="com.example.text05.MyService" >
            <intent-filter>
                <action android:name="com.example.messenger" />
            </intent-filter>
        </service>
在第二个MainActivity中的实现:

package com.example.text06;

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.util.Log;
import android.view.View;

public class MainActivity extends Activity {

	private MyServiceConn conn;
	//创建信使对象用来接受服务端返回的Bind对象
	private Messenger messenger;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		conn = new MyServiceConn();
		// 声明Intent
		Intent intent = new Intent("com.example.messenger");
		// 绑定服务
		boolean flag = bindService(intent, conn, BIND_AUTO_CREATE);
		Log.i("main", "绑定是否成功" + flag);
	}

	class MyServiceConn implements ServiceConnection {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 服务端:IBinder binder = messenger.getBinder();
			// 能不能通过参数service创建一个Messenger对象
			messenger = new Messenger(service);
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}

	}

	public void send(View view) {
		//声明一个Message消息对象
		Message msg = Message.obtain();
		msg.arg1 = 100;
		//这里是不能直接传字符串的,因为字符串String实现的是Serializable接口而不是Parcelable接口
		//所以会出现异常,因为信使中如果传递对象则必须实现Parcelable接口,如果必须传递字符串考虑使用Bundle
//		msg.obj = "你好,我来自客户端";
		Bundle bundle = new Bundle();
		bundle.putString("info", "你好,我来自客户端");
		msg.setData(bundle);
		try {
			//通过信使传递消息
			messenger.send(msg);
		} catch (RemoteException e) {
			
			e.printStackTrace();
		}
	}

}
运行结果:这里是通过点击客户端给服务端发送消息,下面是Log输出




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章