Activity和Service之间的交互

交互的原理:
activity 和 service中各自定义一个handler,通过messenger类来转化IBinder或是Handler,最后在handler中处理消息:
现将关键实现过程做说明:
1.activity和service中各定义一个Handler 和 Messenger

service中的定义的如下:
    private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
        };
    };

    @Override
    public IBinder onBind(Intent intent) {
        //会将message转化为binder
        return messenger.getBinder();
    }

    再看activity中的定义的如下:
    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
        };
    };

    private Messenger activityMessenger = new Messenger(handler);

2.service绑定成功,会走activity中的ServiceConnection中的public void onServiceConnected(ComponentName name, IBinder binder) {}方法:

@Override
        public void onServiceConnected(ComponentName name, IBinder binder) {
            // 将binder转化为Service中的messager
            Messenger playServiceMessenger = new Messenger(binder);
            // 将消息发送给service
            Message message = new Message();
            message.what = AudioPlayService.UI;
            message.obj = AudioPlayerActivity.this;
            try {
                playServiceMessenger.send(message);
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

3.playServiceMessenger 和service中的messenger可以视为同一个,因为发消息用的是同一个handler。所以在activity中用Messenger发送消息,就相当于是Service在用自己的Messenger发消息。消息发送之后,交给handler处理:
service中handler处理的代码如下:

private Handler handler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            //处理onServiceConnected中messenger发送来的消息
            switch (msg.what) {
            case AudioPlayService.UI:
                AudioPlayerActivity activity = (AudioPlayerActivity) msg.obj;
                //调用activity中的方法:
                activity.UpdateUi(null);
                break;
            default:
                break;
            }
        };
    };

经过以上代码就可以实现在service中调用activity的方法。
4.下面再接着实现:activity中调用service中的方法:
在activity的onServiceConnected方法中:新增如下代码:

message.replyTo = activityMessenger;
                try { //然后发送 playServiceMessenger.send(message); } catch (RemoteException e) { e.printStackTrace(); }

5.activity中发送的消息相当于是service中的Messenger在发送消息,交由Service中的handler处理:

Messenger activityMessenger = msg.replyTo;
                //拿到messenger发送消息:
                Message message = new Message();
                message.what =IAUDIOPLAYSERVICE; 
                message.obj = AudioPlayService.this;
                try { activityMessenger.send(message); } catch (RemoteException e) { e.printStackTrace(); }

6.拿到了activityMessenger 发送消息之后,activity中的handler处理的代码如下:

private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case AudioPlayService.IAUDIOPLAYSERVICE:
                AudioPlayService service = (AudioPlayService) msg.obj;
                // 调用service中的start方法
                service.start();
                break;

            default:
                break;
            }
        };
    };

这里写图片描述
最后看打印结果,可以得知activity和service实现了交互。现在用图解说明下:

Activity和Service之间的交互_第1张图片

你可能感兴趣的:(handler)