Activity与Service通信(不同进程之间)
2015-03-19 15:51
369 查看
使用Messenger
上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。
其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处:
1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多
2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。
不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:
再看一下Activity的代码:
注意:以上写的代码只能实现从Activity向Service发送消息,如果想从Service向Activity发送消息,只要把代码反过来写就可以了。
使用AIDL
AIDL,Android Interface Definition Language。建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例的内容。
(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
(3)建立一个服务类(Service的子类)。
(4)实现由aidl文件生成的Java接口。
(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
本文章来自转载点击打开链接
更多内容请查看 http://developer.android.com/guide/components/bound-services.html
上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。
其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处:
1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多
2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。
不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:
public class MessengerService extends Service { /** 用于Handler里的消息类型 */ static final int MSG_SAY_HELLO = 1; /** * 在Service处理Activity传过来消息的Handler */ class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SAY_HELLO: Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } } } /** * 这个Messenger可以关联到Service里的Handler,Activity用这个对象发送Message给Service,Service通过Handler进行处理。 */ final Messenger mMessenger = new Messenger(new IncomingHandler()); /** * 当Activity绑定Service的时候,通过这个方法返回一个IBinder,Activity用这个IBinder创建出的Messenger,就可以与Service的Handler进行通信了 */ @Override public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mMessenger.getBinder(); } }
再看一下Activity的代码:
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
AIDL,Android Interface Definition Language。建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
(1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。详细介绍见实例的内容。
(2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
(3)建立一个服务类(Service的子类)。
(4)实现由aidl文件生成的Java接口。
(5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
本文章来自转载点击打开链接
更多内容请查看 http://developer.android.com/guide/components/bound-services.html
相关文章推荐
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Service与Activity之间的通信(同一进程)binder
- Android Activity与Service通信(不同进程之间)详解
- Activity与Service通信(同进程之间)
- Service与Activity之间的通信(同一进程)
- 利用Messenger实现同一进程Activity和Service之间的通信
- Activity通过bindService启动Service后Activity和Service之间的通信!
- android 的Activity和Service之间的通信
- socket编程的理解-------解决不同主机上进程之间的通信
- Activity和Service之间的通信
- Activity_01常见控件的使用方法以及不同Activity之间的通信
- Android中进程之间通信的机制--Activity
- android 的Activity和Service之间的通信