用 Messenger 進行 不同進程中的通信

簡單實現,直接上代碼
service 端

public class MessageService extends Service {
	private static final String TAG = "MessageService";

	private final static int ERR_M1_NO_ERROR = -1; 
	private final static int ERR_1_ERROR = 1; 

	private final static String RESPONSE_100_CODE = "RESPONSE_100_CODE";
	public final static int REQUEST_PAY_100_CODE = 100;

	private static final String ACTION_STOP_SERVICE = "ACTION_STOP_SERVICE";

	private Messenger messenger;

	@SuppressLint("HandlerLeak")
	private Messenger mMessenger = new Messenger(new Handler(){
		@Override
		public void handleMessage(Message msg) {
			messenger = msg.replyTo;
			switch (msg.what){
				case REQUEST_PAY_100_CODE:
					Bundle data = msg.getData();
					Log.d(TAG,"server::" + data.get("params"));
					Message messageBasic = Message.obtain();
					messageBasic.what = ERR_M1_NO_ERROR;
					data = new Bundle();
					data.putString(RESPONSE_100_CODE,"哈哈哈");
					messageBasic.setData(data);
					try {
						msg.replyTo.send(messageBasic);
					} catch (RemoteException e) {
						e.printStackTrace();
					}
					break;
			}
		}
	});

	@Override
	public void onCreate() {
		super.onCreate();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return super.onStartCommand(intent, flags, startId);
	}

	@Nullable
	@Override
	public IBinder onBind(Intent intent) {
		return mMessenger.getBinder();
	}

	@Override
	public boolean onUnbind(Intent intent) {
		return super.onUnbind(intent);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	class StopReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			String mAction = intent.getAction();
			if(TextUtils.equals(mAction,ACTION_STOP_SERVICE)){
				stopSelf();
			}
		}
	}
}

androidManofest.xml文件添加

<service android:name=".service.MessageService"
	android:exported="true"/>

client端

定義一個callback監聽器 AsyPayCallbackListener

public class AsyPayCallbackListener {
	public void success(String result){

	}

	public void error(String errMsg){

	}

}

發送工具類AsyUtilHelper

public class AsyUtilHelper{
	private static final String TAG = "AsyUtilHelper";

	private final static int ERR_M1_NO_ERROR = -1; //爲了避免對0判斷造成的意料之外的問題,使用-1來表示無錯誤
	private final static int ERR_1_ERROR = 1; //表示出錯,不指明是哪種錯誤

	private final static String RESPONSE_100_CODE = "RESPONSE_100_CODE";
	private final static int REQUEST_PAY_100_CODE = 100;

	private final static String PACKAGE_NAME = "";// 要進行交互的app的package 路徑
	private final static String SERVICE_NAME = "";// 要進行交互的app的service 路徑

	private AsyPayCallbackListener callback;

	private Messenger mServerMessenger;
	private Context mContext;

	private Thread thread;

	public AsyUtilHelper(Context context) {
		this.mContext = context;
		bindService();
	}

	public void bindService() {
		Intent mIntent = new Intent();
		mIntent.setComponent(new ComponentName(PACKAGE_NAME, SERVICE_NAME));
		mContext.bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
	}


	private void execute(final Map<String, String> params, AsyPayCallbackListener callback) {
	
		try {
			this.callback = callback;
			Message message = Message.obtain();
			message.what = REQUEST_PAY_100_CODE;
			Bundle mBundle = new Bundle();
			mBundle.putString("params", params.toString());
			message.setData(mBundle);
			message.replyTo = mClientMessenger;
			try {
				mServerMessenger.send(message);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		} catch (Exception ex) {
			Message msg = Message.obtain();
			msg.what = ERR_1_ERROR;
			msg.obj = ex.getMessage();
			handler.sendMessage(msg);
		}
	}

	public void send(Map<String, String> params, AsyPayCallbackListener callback) {
		execute(params, callback);
	}

	@SuppressLint("HandlerLeak")
	private Messenger mClientMessenger = new Messenger(new Handler() {
		@Override
		public void handleMessage(Message msg) {
			Bundle data = msg.getData();
			if (data == null) {
				msg = Message.obtain();
				msg.what = ERR_1_ERROR;
				msg.obj = "Request Fail";
				handler.sendMessage(msg);
				return;
			}
			switch (msg.what) {
				case ERR_M1_NO_ERROR:
					msg = Message.obtain();
					msg.obj = data.get(RESPONSE_100_CODE);
					handler.sendMessage(msg);
					break;
				case ERR_1_ERROR:
					msg = Message.obtain();
					msg.obj = data.get(RESPONSE_100_CODE);
					handler.sendMessage(msg);
					break;
			}
		}
	});

	private ServiceConnection mServiceConnection = new ServiceConnection() {
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mServerMessenger = new Messenger(service);
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
	};

	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch (msg.what) {
				case ERR_M1_NO_ERROR:
					callback.success((String) msg.obj);
					break;
				case ERR_1_ERROR:
					callback.error((String) msg.obj);
					break;
			}
		}
	};


}

進行調用

	AsyUtilHelper  util = new AsyUtilHelperthis;
	util .send(new HashMap<String, String>(), new AsyPayCallbackListener() {
		@Override
				public void success(String result) {
					Log.d("123", "server:" + result);
				}
	
				@Override
				public void error(String errMsg) {
					Log.d("123", "server:" + errMsg);
				}
			});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章