Messenger可以实现在不同进程之间传递Message对象,Messenger底层基于AIDL,并且一次处理一个请求,因此不需要考虑线程同步问题。
服务端:
public class MessengerService extends Service {
private final static int FROM_Client=1;
private static class MessengerHandler extends Handler{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case FROM_Client:
Log.d("MessengerService", msg.getData().getString("msg"));
break;
default:
super.handleMessage(msg);
break;
}
}
}
private final Messenger messenger=new Messenger(new MessengerHandler());
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return messenger.getBinder();
}
}
指定线程:
<service android:name="com.example.fortest.service.MessengerService"
android:process=":remote"/>
客户端:
public class MainActivity extends Activity {
//private Button mButton;
private Messenger mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// mButton=(Button) findViewById(R.id.btn);
Intent intent=new Intent(MainActivity.this,MessengerService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection mConnection=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mService=new Messenger(service);
Message message=Message.obtain(null,1);
Bundle data=new Bundle();
data.putString("msg","this is client");
message.setData(data);
try{
mService.send(message);
}catch(RemoteException e){
e.printStackTrace();
}
}
};
@Override
protected void onDestroy(){
super.onDestroy();
unbindService(mConnection);
}
}