Activity与Service通信(不同进程之间)
来源:互联网 发布:知柏地黄丸治疗失眠吗 编辑:程序博客网 时间:2024/04/30 05:36
使用Messenger
上面的方法只能在同一个进程里才能用,如果要与另外一个进程的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; } } }
使用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
0 0
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(不同进程之间)
- Activity与Service通信(同进程之间)
- Service与Activity之间的通信(同一进程)binder
- Activity与Service之间通信
- Activity与Service之间通信
- android activity与service之间的通信
- Service与Activity之间通信(学习笔记)
- Android Service与Activity之间通信方式
- Android Service与Activity之间通信
- Activity与service 之间的通信
- Activity 与 Service 之间的通信
- activity 与 service 之间的通信
- activity 与 service 之间的通信
- activity 与 service 之间的通信
- 解决XCode6在IOS7系统上出现部分黑屏与不适配问题
- dp+二分(uva-10029Edit Step Ladders)
- Android Binder驱动的工作机制之要旨
- 多线程, 并发编程知识总结
- Linux下反编译.apk 文件
- Activity与Service通信(不同进程之间)
- ios 合并真机和模拟器的.a文件(lipo)
- OpenGL ES ETC 图像压缩
- java synchronized详解
- 命由己造,相由心生,境随心转,有容乃大
- Thrust快速入门教程(三) —— Algorithms
- mac下普通用户无法创建crontab的问题解决
- Java public private protected和默认的可访问性级别
- Linux网络编程--5. 用户数据报发送