- 正常的使用Service,我們都是在ServiceConnection的回調(diào)中強(qiáng)轉(zhuǎn)成自己的service,
- 下面這種是沒有在xml中開啟進(jìn)程的,這樣使用沒有問題窜护。
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
ProcessService processService = (ProcessService) iBinder;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
但是如果在xml中添加android:process="xxxx" 后 睡腿,上面的方法就不可以用了!
那就需要使用Messenger爷光,而且Messenger在開進(jìn)程或者不開進(jìn)程中都可以使用垫竞,所以建議使用Messenger進(jìn)行活動與service間的通信,而且使用起來也簡單
首先需要在service中創(chuàng)建對象蛀序,需要一個Handler來進(jìn)行鏈接
public static final int MSG_1 = 1;
public static final int MSG_2 = 2;
public static final int MSG_3 = 3;
private Messenger mMessenger = new Messenger(mHandler);
private static Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.arg1) {
case MSG_1:
String msg1 = msg.getData().getString("msg");
L.d( " msg 1 " + msg1);
break;
case MSG_2:
L.d( " msg 2 ");
break;
case MSG_3:
L.d( " msg 3 ");
break;
default:
break;
}
}
};
//在onBind的回調(diào)中寫上Messenger的binder
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
//好了欢瞪,service中的代碼這樣就算完成了
- 然后就是activity中的代碼
//首先綁定服務(wù)
bindService(new Intent(this , ProcessService.class) , mConnection , Context.BIND_AUTO_CREATE );
//然后就是在ServiceConnection的回調(diào)中得到Messenger的對象
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder iBinder) {
mMessenger = new Messenger(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//得到Messenger的對象就可以使用它進(jìn)行發(fā)送信息了,它需要一個message對象哼拔。
public void btnOnClick(View view){
Message message = new Message();
message.arg1 = ProcessService.MSG_1;
message.getData().putString("msg" , "this is msg");
try {
mMessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
- 這樣不管xml中開了進(jìn)程或者沒有開引有,都可以用上面的方法進(jìn)行與服務(wù)之間的簡單通信