Android開發(fā)使用Messenger及Handler進(jìn)行通信的方法示例
本文實(shí)例講述了Android開發(fā)使用Messenger及Handler進(jìn)行通信的方法。分享給大家供大家參考,具體如下:
1. 客戶端service
public class MessageService extends Service { private static final int MSG_SET_VALUE = 0x110; private Handler mHandler = new Handler() { public void handleMessage(Message msgFromClient) { // 返回給客戶的信息 Message msgToClient = Message.obtain(msgFromClient); switch (msgFromClient.what) { // msg 客戶端傳來的消息 case MSG_SET_VALUE: try { msgToClient.what = MSG_SET_VALUE; SystemClock.sleep(2000); msgToClient.arg2 = msgFromClient.arg1 + msgFromClient.arg2; //msgFromClient.replyTo.send(msgToClient); //得到客戶端的信使對(duì)象,并向它發(fā)送消息 cMessenger = msgFromClient.replyTo; cMessenger.send(msgToClient); } catch (RemoteException e) { e.printStackTrace(); } break; default: break; } } }; private Messenger mMessager = new Messenger(mHandler); private Messenger cMessenger; @Override public IBinder onBind(Intent intent) { return mMessager.getBinder(); } @Override public void onDestroy() { cMessenger = null; super.onDestroy(); } }
2. 服務(wù)器端service
public class MessageService extends Service { private static final int MSG_SET_VALUE = 0x110; private Handler mHandler = new Handler() { public void handleMessage(Message msgFromClient) { // 返回給客戶的信息 Message msgToClient = Message.obtain(msgFromClient); switch (msgFromClient.what) { // msg 客戶端傳來的消息 case MSG_SET_VALUE: try { msgToClient.what = MSG_SET_VALUE; SystemClock.sleep(2000); msgToClient.arg2 = msgFromClient.arg1 + msgFromClient.arg2; //msgFromClient.replyTo.send(msgToClient); //得到客戶端的信使對(duì)象,并向它發(fā)送消息 cMessenger = msgFromClient.replyTo; cMessenger.send(msgToClient); } catch (RemoteException e) { e.printStackTrace(); } break; default: break; } } }; private Messenger mMessager = new Messenger(mHandler); private Messenger cMessenger; @Override public IBinder onBind(Intent intent) { return mMessager.getBinder(); } @Override public void onDestroy() { cMessenger = null; super.onDestroy(); } }
3. 客戶端使用
public class MainActivity extends Activity { private static final int MSG_SET_VALUE = 0x110; private TextView mTVStatus; // 連接狀態(tài) private LinearLayout mLLContainer;// 用來添加接收到服務(wù)器返回的信息 private Messenger mService; // 客戶端信使 private boolean isConnecting; // 是否連接 private Handler mHandler = new Handler() { public void handleMessage(Message msgFromServer) { switch (msgFromServer.what) { case MSG_SET_VALUE: TextView tv = (TextView) findViewById(msgFromServer.arg1); tv.setText(tv.getText() + "==>" + msgFromServer.arg2); break; } super.handleMessage(msgFromServer); }; }; private Messenger mMessenger = new Messenger(mHandler); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTVStatus = (TextView) findViewById(R.id.tv_status); mLLContainer = (LinearLayout) findViewById(R.id.ll_container); } int i = 0; public void send(View view){ try { int a = i++; int b = (int) (Math.random() * 100); //創(chuàng)建一個(gè)tv,添加到LinearLayout中 TextView tv = new TextView(MainActivity.this); tv.setText(a + " + " + b + " = caculating ..."); tv.setId(a); mLLContainer.addView(tv); Message msgFromClient = Message.obtain(null, MSG_SET_VALUE, a, b); msgFromClient.replyTo = mMessenger; if (isConnecting) { //往服務(wù)端發(fā)送消息 mService.send(msgFromClient); } } catch (RemoteException e) { e.printStackTrace(); } } public void bind(View view) { Intent service = new Intent(); service.setAction("android.intent.action.MESSAGE_SERVER"); bindService(service, conn, Context.BIND_AUTO_CREATE); } private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mService = null; isConnecting = false; mTVStatus.setText("已斷開連接!"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); isConnecting = true; mTVStatus.setText("連接成功!"); } }; public void unbind(View view) { unbindService(conn); conn = null; } @Override protected void onDestroy() { unbindService(conn); conn = null; super.onDestroy(); } }
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android通信方式總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android進(jìn)程通信之Messenger和AIDL使用詳解
- Android IPC機(jī)制利用Messenger實(shí)現(xiàn)跨進(jìn)程通信
- 深入理解Android中的Handler異步通信機(jī)制
- 深入Android Handler與線程間通信ITC的詳解
- Android Handler主線程和一般線程通信的應(yīng)用分析
- Android 進(jìn)程間通信實(shí)現(xiàn)原理分析
- Android Socket通信詳解
- Android編程之客戶端通過socket與服務(wù)器通信的方法
- Android單片機(jī)與藍(lán)牙模塊通信實(shí)例代碼
- Android之網(wǎng)絡(luò)通信案例分析
- Android網(wǎng)絡(luò)編程之UDP通信模型實(shí)例
相關(guān)文章
android通過Location API顯示地址信息的實(shí)現(xiàn)方法
這篇文章主要介紹了android通過Location API顯示地址信息的方法,涉及Android操作Geocoder類獲取地址信息的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07android開發(fā)設(shè)計(jì)模式之——單例模式詳解
本篇文章主要介紹了android開發(fā)設(shè)計(jì)模式之——單例模式詳解,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11Android獲取設(shè)備CPU核數(shù)、時(shí)鐘頻率以及內(nèi)存大小的方法
這篇文章主要介紹了Android獲取設(shè)備CPU核數(shù)、時(shí)鐘頻率以及內(nèi)存大小的方法,涉及Android針對(duì)系統(tǒng)硬件相關(guān)操作技巧,需要的朋友可以參考下2016-07-07Android ListView物流獲取追蹤功能實(shí)現(xiàn)
這篇文章主要介紹了Android ListView物流獲取追蹤功能實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2016-03-03Android編程操作聯(lián)系人的方法(查詢,獲取,添加等)
這篇文章主要介紹了Android編程操作聯(lián)系人的方法,包括針對(duì)聯(lián)系人的查詢,獲取,添加等操作,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-01-01Android中BaseActivity自定義標(biāo)題欄
這篇文章主要介紹了Android中BaseActivity自定義標(biāo)題欄,非常實(shí)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01Android如何獲取系統(tǒng)通知的開啟狀態(tài)詳解
這篇文章主要給大家介紹了關(guān)于Android如何獲取系統(tǒng)通知開啟狀態(tài)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起看看吧啊。2017-08-08關(guān)于android連續(xù)點(diǎn)擊出現(xiàn)多個(gè)Activity界面的解決方法
這篇文章主要介紹了關(guān)于android連續(xù)點(diǎn)擊出現(xiàn)多個(gè)Activity界面的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03