所謂的信使就是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輸出