您的位置:首页 > 移动开发 > Android开发

Activity与Service用Messenger通信

2016-07-07 22:50 447 查看
1.在Service中创建Messenger包装Handler引用
Service中的handler:
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case MSG_INIT:
FileInfo fileInfo= (FileInfo) msg.obj;
Log.i("test", "Init" + fileInfo.toString());
//启动下载任务的服务,每个任务启动3个线程
DownloadTask task=new DownloadTask(DownloadService.this,fileInfo,3,activityMassager);
//把下载任务添加到集合中
tasks.put(fileInfo.getId(),task);
task.downLoad();
Message message=new Message();
message.what=MSG_START;
message.obj=fileInfo;
try {
activityMassager.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
case MSG_BIND://处理绑定的
activityMassager=msg.replyTo;//获取到Activity的Manager,用于传递信息
break;
case MSG_START:
FileInfo fileInfo1=(FileInfo)msg.obj;
//启动初始化线程
new InitThread(fileInfo1).start();
break;
case MSG_STOP:
FileInfo fileInfo2=(FileInfo)msg.obj;
//从任务集合中取出下载任务
DownloadTask task1=tasks.get(fileInfo2.getId());
if(task1!=null){
//暂停下载
task1.isPuse=true;
}
break;
}
}
};

2.在Service的onBind方法中返回Messenger

@Override
public IBinder onBind(Intent intent) {
//创建一个messager对象
Messenger messager=new Messenger(handler);
return messager.getBinder();
}

3.Activity的create()中绑定Service,获取Service的Messenger
//通过connection对象绑定Service,connection定义在第5点
Intent intent=new Intent(this,DownloadService.class);
bindService(intent,connection, Service.BIND_AUTO_CREATE);
4.在connection对象中Activity中创建Messenger包含Handler引用。Activity中的handler:
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case DownloadService.MSG_UPDATE:
int finished=msg.arg1;
int id=msg.arg2;
adapter.updateProgress(id, finished);
//更新通知里的进度条
notificationUtil.updateNotification(id, finished);
break;
case DownloadService.MSG_FINISH:
//下载结束
FileInfo fileInfo= (FileInfo) msg.obj;
//更新进度为0
adapter.updateProgress(fileInfo.getId(), 0);
Toast.makeText(MainActivity.this,fileInfoList.get(fileInfo.getId()).getFileName()+"下载完毕",Toast.LENGTH_SHORT).show();

//取消通知
notificationUtil.cancelNotification(fileInfo.getId());
break;
case DownloadService.MSG_START:
//显示通知
notificationUtil.showNotification((FileInfo) msg.obj);
break;

}
}
};
5.在connection对象中使用Service的Messenger发送信息给Service的Handler,信息包括Activity的Messenger,connection定义如下:
ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {//连接时调用

//获得service中的Messager
serviceMessager=new Messenger(service);

//创建Activity中的Messeager
Messenger messager=new Messenger(handler);
//创建消息
Message msg=new Message();
msg.what=DownloadService.MSG_BIND;
msg.replyTo=messager;//传递Messenger
//使用Service的Messager发送activity中的Messager
try {
serviceMessager.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}

@Override
public void onServiceDisconnected(ComponentName name) {

}
};
6.这样就可以实现双向通信,处理收到的数据在定义的Handler中,发送数据的格式,只需要调用Messenger中的send()方法就可以发数据:
Message message=new Message();
message.what=MSG_START;
message.obj=fileInfo;
try {
activityMassager.send(message);
} catch (RemoteException e) {
e.printSt
4000
ackTrace();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息