Activity与Service用Messenger通信

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();
        }        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值