初学service,根据官方文档对进程通信的方法messenger进行一个简单的介绍。Messager是利用Handler形式处理,
它是线程安全的,这也表示它不支持并发处理。在实现IPC进程间通信的过程中,大部分情况下,我们的应用不需要并发处理。
因此,我们只需要使用Messenger方式。
以下是 Messenger 的使用方法摘要:
1.服务实现一个 Handler,由其接收来自客户端的每个调用的回调
2.Handler 用于创建 Messenger 对象(对 Handler 的引用)
3.Messenger 创建一个 IBinder,服务通过 onBind() 使其返回客户端
4.客户端使用 IBinder 将 Messenger(引用服务的 Handler)实例化,然后使用后者将 Message 对象发送给服务
5.服务在其 Handler 中(具体地讲,是在 handleMessage() 方法中)接收每个 Message。
下面我们通过一个简单的例子来实现:
public class MessengerService extends Service {
public static final int SAY_HELLO=0x1;
public MessengerService() {
}
//1.服务实现一个 Handler,由其接收来自客户端的每个调用的回调
private Handler handler=new Handler(){
//5.服务在其 Handler 中(具体地讲,是在 handleMessage() 方法中)接收每个 Message。
@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case SAY_HELLO:
String info=(String) msg.obj;
Toast.makeText(getApplicationContext(),info,Toast.LENGTH_SHORT).show();
break;
}
}
};
//2.创建 Messenger 对象(对 Handler 的引用)
private Messenger messenger=new Messenger(handler);
//3.Messenger 创建一个 IBinder,服务通过 onBind() 使其返回客户端
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
}
注意:服务就是在 Handler 的 handleMessage() 方法中接收传入的 Message,并根据 what 成员决定下一步操作。
客户端只需根据服务返回的 IBinder 创建一个 Messenger,然后利用 send() 发送一条消息。
例如,以下就是一个绑定到服务并向服务传递SAY_HELLO 消息的简单 Activity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Messenger mService;
boolean flag =false;
private ServiceConnection conn=new ServiceConnection() {
//服务连接时
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mService=new Messenger(service);
flag=true;
}
//服务断开连接时
@Override
public void onServiceDisconnected(ComponentName name) {
mService=null;
flag=false;
}
};
@Override
//在onStart()中绑定服务
protected void onStart() {
super.onStart();
Intent service=new Intent(this,MessengerService.class);
bindService(service,conn, Context.BIND_AUTO_CREATE);
}
//在onStop()中解除绑定服务
protected void onStop(){
super.onStop();
if (flag){
unbindService(conn);
flag=false;
}
}
//对单击事件进行命令动作传输动作
public void MessageonClick(View view){
//创建(获取)一个消息对象
Message msg=Message.obtain();
msg.what=MessengerService.SAY_HELLO;
msg.obj="更新啦";
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
简单的就讲解这里啦。已上传源代码。下载地址:
http://download.csdn.net/detail/cyy950611/9823473