Android開發(fā)使用Messenger及Handler進行通信的方法示例
本文實例講述了Android開發(fā)使用Messenger及Handler進行通信的方法。分享給大家供大家參考,具體如下:
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);
//得到客戶端的信使對象,并向它發(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. 服務器端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);
//得到客戶端的信使對象,并向它發(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;// 用來添加接收到服務器返回的信息
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)建一個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) {
//往服務端發(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ā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- Android進程通信之Messenger和AIDL使用詳解
- Android IPC機制利用Messenger實現(xiàn)跨進程通信
- 深入理解Android中的Handler異步通信機制
- 深入Android Handler與線程間通信ITC的詳解
- Android Handler主線程和一般線程通信的應用分析
- Android 進程間通信實現(xiàn)原理分析
- Android Socket通信詳解
- Android編程之客戶端通過socket與服務器通信的方法
- Android單片機與藍牙模塊通信實例代碼
- Android之網(wǎng)絡(luò)通信案例分析
- Android網(wǎng)絡(luò)編程之UDP通信模型實例
相關(guān)文章
SimpleCommand實現(xiàn)上傳文件或視頻功能(四)
這篇文章主要介紹了SimpleCommand實現(xiàn)上傳文件或視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
Android Fragment監(jiān)聽返回鍵的一種合理方式
這篇文章主要給大家介紹了關(guān)于Android Fragment監(jiān)聽返回鍵的一種合理方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Android自定義WaveView實現(xiàn)波浪進度效果
最近注意到百度外賣以及淘寶個人中心,都用到了類似水波起伏的效果,于是就參照網(wǎng)上的資料然后自己整改,自定義了一個waveView來實現(xiàn)這個效果,文中給出來詳細的實現(xiàn)原理及實例代碼,有需要的朋友們可以參考借鑒,下面來一起看看吧。2017-01-01
Android互聯(lián)網(wǎng)訪問圖片并在客戶端顯示的方法
這篇文章主要介紹了Android互聯(lián)網(wǎng)訪問圖片并在客戶端顯示的方法,結(jié)合實例分析了Android處理圖片的技巧,并附帶了Android的URL封裝類,網(wǎng)絡(luò)連接封裝類與輸出流封裝類,需要的朋友可以參考下2015-12-12
Android使用fastjson庫解析json字符串實戰(zhàn)
fastjson是一個Java語言編寫的高性能功能完善的JSON庫,它采用一種“假定有序快速匹配”的算法,把JSON?Parse的性能提升到極致,是目前Java語言中最快的JSON庫,Fastjson接口簡單易用,已經(jīng)被廣泛使用在緩存序列化、協(xié)議交互、Web輸出、Android客戶端等多種應用場景2023-11-11
Android Tablayout 自定義Tab布局的使用案例
這篇文章主要介紹了Android Tablayout 自定義Tab布局的使用案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android Studio升級3.6 Build窗口出現(xiàn)中文亂碼問題解決方法
這篇文章主要介紹了Android Studio升級3.6 Build窗口出現(xiàn)中文亂碼問題解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03

