Messenger實現跨進程通信

服務端:

public class MessagerService extends Service {
	private static final int MSG_SUM = 0x110;
	static final int MSG_REGISTER_CLIENT = 1;
	static final int MSG_UNREGISTER_CLIENT = 2;
	static final int MSG_SET_VALUE = 3;
	protected static final String TAG = "dong";
	// 服務端

	private Handler mHandler = new Handler() {

		public void handleMessage(Message msg) {
			// ;// 返回給客戶端的消息
			switch (msg.what) {
			case MSG_SUM:
				Bundle ClientBundle = (Bundle) msg.obj;
				Log.e("dong", ClientBundle.getString("msg"));

				Bundle bundle = new Bundle();
				Log.e("dong", "" + msg.arg1);
				bundle.putString("msg", "來自服務端的問候");
				Message msgToClient = Message.obtain();
				msgToClient.what = MSG_SUM;
				msgToClient.obj = bundle;
				try {
					msg.replyTo.send(msgToClient);
				} catch (RemoteException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				break;

			default:
				break;
			}
		};
	};
	private Messenger mServiceMessage = new Messenger(mHandler);
	// private Messenger mClientMessenger;// 客戶端messenger對象

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		Log.e("dong", "onBind");
		return mServiceMessage.getBinder();
	}

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

	@Override
	public void unbindService(ServiceConnection conn) {
		unbindService(conn);
		super.unbindService(conn);
	}
}


xml文件

<service
            android:name="com.example.servermessager.MessagerService"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.example.servermessager.MessagerService" />
            </intent-filter>
        </service>


客戶端

public class MainActivity extends Activity {

	private static final String TAG = "dong";
	private static final int MSG_SUM = 0x110;

	private Button mBtnAdd;
	private LinearLayout mLyContainer;
	// 顯示連接狀態
	private TextView mTvState;

	private Messenger mService;
	private boolean isConn;
	// 處理來自服務端的數據
	private Messenger mMessenger = new Messenger(new Handler() {
		@Override
		public void handleMessage(Message msgFromServer) {
			switch (msgFromServer.what) {
			case MSG_SUM:
				Bundle bundle = (Bundle) msgFromServer.obj;
				String object = bundle.getString("msg");

				mTextView.setText("context" + object);
				break;
			}
			super.handleMessage(msgFromServer);
		}
	});

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mTextView = (TextView) findViewById(R.id.id_tv_content);
		mTvState = (TextView) findViewById(R.id.id_tv_callback);
		mBtnAdd = (Button) findViewById(R.id.id_btn_add);
		mButton = (Button) findViewById(R.id.id_btn_unbind);

		// 發送消息
		mButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Message msgFromClient = Message.obtain();
				msgFromClient.what = MSG_SUM;
				Bundle bundle = new Bundle();
				bundle.putString("msg", "來自客戶端的問候");
				msgFromClient.obj = bundle;
				msgFromClient.replyTo = mMessenger;
				if (isConn) {
					// 往服務端發送消息
					try {
						mService.send(msgFromClient);
					} catch (RemoteException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}

		});

		// 綁定服務
		mBtnAdd.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				if (!bindService) {
					bindServiceInvoked();
				}

			}
		});
	}

	private ServiceConnection mConn = new ServiceConnection() {
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mService = new Messenger(service);// 獲取服務端messenger對象
			isConn = true;
			mTvState.setText("connected!");
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mService = null;
			isConn = false;
			mTvState.setText("disconnected!");
		}
	};
	private boolean bindService;
	private Button mButton;
	private TextView mTextView;

	/**
	 * 綁定服務端的服務
	 */
	private void bindServiceInvoked() {
		Intent intent = new Intent();
		intent.setAction("com.example.servermessager.MessagerService");
		bindService = bindService(intent, mConn, BIND_AUTO_CREATE);
		Log.e(TAG, "bindService invoked !");
	}

	@Override
	protected void onDestroy() {
		unbindService(mConn);
		super.onDestroy();
	}
}



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