- 正常的使用Service,我们都是在ServiceConnection的回调中强转成自己的service,
- 下面这种是没有在xml中开启进程的,这样使用没有问题。
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在开进程或者不开进程中都可以使用,所以建议使用Messenger进行活动与service间的通信,而且使用起来也简单
-
首先需要在service中创建对象,需要一个Handler来进行链接
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的回调中写上Messenger的binder
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
//好了,service中的代码这样就算完成了
- 然后就是activity中的代码
//首先绑定服务
bindService(new Intent(this , ProcessService.class) , mConnection , Context.BIND_AUTO_CREATE );
//然后就是在ServiceConnection的回调中得到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的对象就可以使用它进行发送信息了,它需要一个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中开了进程或者没有开,都可以用上面的方法进行与服务之间的简单通信
网友评论