读书人

Activity与Service通讯

发布时间: 2012-07-01 13:15:00 作者: rapoo

Activity与Service通信

Activity与Service通信的方式有三种:

?

继承Binder类

? 这个方式只有当你的Acitivity和Service处于同一个Application和进程时,才可以用,比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信。

用例子来说明其使用方法:

? 1. 来看Service的写法:

?

?

?? 这里就是通过IBinder来得到LocalService对象,再去调用其Public方法。

使用Messenger

? ?上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。

? ? 其实实现IPC的方式,还有AIDL,但推荐使用Messenger,有两点好处:

? ? ? 1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多

? ? ? 2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。

? 不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:

?

public class ActivityMessenger extends Activity {    /** 向Service发送Message的Messenger对象 */    Messenger mService = null;    /** 判断有没有绑定Service */    boolean mBound;    private ServiceConnection mConnection = new ServiceConnection() {        public void onServiceConnected(ComponentName className, IBinder service) {            // Activity已经绑定了Service            // 通过参数service来创建Messenger对象,这个对象可以向Service发送Message,与Service进行通信            mService = new Messenger(service);            mBound = true;        }        public void onServiceDisconnected(ComponentName className) {            mService = null;            mBound = false;        }    };    public void sayHello(View v) {        if (!mBound) return;        // 向Service发送一个Message        Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);        try {            mService.send(msg);        } catch (RemoteException e) {            e.printStackTrace();        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);    }    @Override    protected void onStart() {        super.onStart();        // 绑定Service        bindService(new Intent(this, MessengerService.class), mConnection,            Context.BIND_AUTO_CREATE);    }    @Override    protected void onStop() {        super.onStop();        // 解绑        if (mBound) {            unbindService(mConnection);            mBound = false;        }    }}

?注意:以上写的代码只能实现从Activity向Service发送消息,如果想从Service向Activity发送消息,只要把代码反过来写就可以了。

?

使用AIDL

? 这个方法略,如果知道上面两种方法,这个方法基本很少会用到。

?

?

读书人网 >移动开发

热点推荐