Activity与Service用Messenger通信

来源:互联网 发布:ubuntu查看ip 编辑:程序博客网 时间:2024/05/29 18:03
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.printStackTrace();        }        
0 0
原创粉丝点击