`
hunankeda110
  • 浏览: 746441 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Activity与Service通信(不同进程之间)

阅读更多
使用Messenger

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

    其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处:

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

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

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



Java代码 
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的代码:



Java代码 
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类的参数值。
分享到:
评论

相关推荐

    AIDL Demo源码实现Activity与Service进程间通信

    `android:process=":remote"`表示Service将在与应用主进程不同的进程中运行,实现进程间的隔离。 4. 调用Service:在Activity中,我们需要获取Service的Binder,然后就可以调用AIDL中定义的方法了。首先,通过`...

    service与activity之间的通信

    // 当不再需要与Service通信时,解绑 unbindService(serviceConnection); ``` 四、BroadcastReceiver通信 Service也可以通过BroadcastReceiver向Activity发送消息。Service在完成任务后,可以发送一个自定义广播,...

    进程内Activity和service使用Binder通信代码备份

    4. 测试代码:压缩包中的`TestService`可能包含了对上述步骤的实现,可以运行这个测试服务来验证Activity与Service之间的Binder通信是否正常。确保在AndroidManifest.xml中注册了Service,并给予必要的权限。 总结...

    Android Activity与Service通信(不同进程之间)详解

    在Android应用开发中,Activity与Service之间的通信是十分常见的需求,尤其当Service运行在不同的进程中时,这种通信机制显得尤为重要。下面将详细讲解三种不同方式来实现Activity与Service的跨进程通信。 首先,...

    Activity与Service通讯、进程通讯

    本文将详细介绍如何使用`Messenger`机制来实现`Activity`与`Service`之间的通信,以及如何进一步扩展这种通信机制以支持跨进程通信。 #### Messenger实现Activity与Service通讯 `Messenger`是一种用于在不同组件...

    不同应用的activity进程间通信demo

    当涉及到不同应用之间的Activity通信时,我们通常会利用Android提供的Intent、Binder机制、ContentProvider、BroadcastReceiver等方法。以下将详细介绍这些通信方式及其应用。 一、Intent通信 Intent是Android中最...

    Activity与Service通信(同一个应用内)

    总的来说,理解并熟练掌握Activity与Service之间的通信方式,对于构建功能丰富的Android应用至关重要。开发者应根据需求灵活选择合适的方法,同时注意性能和资源的合理利用,确保应用的稳定性和用户体验。

    Android开发-Activity与Service使用Messenger通信代码

    这就是使用Messenger进行Activity和Service通信的基本流程。这种通信方式相对简单,适用于需要频繁、轻量级的消息传递。然而,如果需要传输大量数据或复杂的对象,可能需要考虑其他如AIDL(Android Interface ...

    启动服务并与activity通信

    本文将详细讨论如何启动Service以及Activity与Service之间的通信机制。 首先,我们来看启动Service的两种主要方式: 1. **显式启动(Explicit Start)**: 显式启动Service时,我们需要明确指定Service的类名。...

    Android中Service与Activity之间通信的几种方式

    在Android应用开发中,Service与Activity之间的通信是一个重要的主题,因为它们各自承担着不同的职责:Activity作为用户界面的载体,Service则用于执行后台任务。在本文中,我们将深入探讨两种常见的Service与...

    Service与Activity的通信

    本示例探讨的是如何实现`Service`与`Activity`之间的有效通信,确保`Service`能及时更新`Activity`的用户界面。以下是关于这个主题的详细讲解。 1. **Service**: `Service`是Android中的一个系统服务,它可以在后台...

    Service与Activity之间的通信(同一进程)

    Service与Activity之间的通信是Android应用开发中的重要概念,特别是在处理后台任务和服务持久运行时非常关键。当Activity和Service处于同一进程时,它们之间的通信可以通过Binder机制实现,这是一种轻量级的进程间...

    Activity和Service生命周期及使用AIDL通信实例备份

    本篇将深入探讨Activity和Service的生命周期以及如何利用Android Interface Definition Language (AIDL)进行进程间通信。 Activity是Android应用程序的用户界面,它负责与用户交互。Activity的生命周期分为几个关键...

    Service与Activity通信示例

    Service与Activity之间的通信主要通过以下几种方式实现: 1. **Binder**: Binder是Android系统中的进程间通信(IPC)机制。你可以创建一个实现了IBinder接口的类,并在Service中暴露这个类的实例。Activity通过...

    android 本地服务通信 AIDL service服务与activity之间的通信

    本示例“android 本地服务通信 AIDL service服务与activity之间的通信”通过一个学号查询学生的例子,清晰地展示了如何利用AIDL实现在Activity和Service之间的数据传递。 首先,我们需要了解AIDL的基本概念。AIDL...

    广播方式与service通信

    Service与Activity之间的通信是Android系统中一个重要的知识点,它允许我们实现Activity和Service之间的数据交互、状态传递以及控制Service的生命周期。广播(Broadcast)是Android系统中另一种通知全局事件的方式,...

    Activity与远程Service通信,使用AIDL

    总结来说,AIDL在Activity与远程Service通信中扮演了关键角色,它使得两个不同进程间的对象能够透明地调用对方的方法。通过定义接口、实现接口、在Service中返回Binder实例以及在Activity中绑定Service,我们可以...

    Activity中使用AIDL让Service与Activity通信

    6. 当我们需要与Service通信时,就可以通过`mService`对象调用Service中定义的方法。注意,由于是跨进程通信,所有方法调用都是异步的,不能直接得到结果,需要通过回调或者其他方式处理。 7. 不要忘记在Activity中...

Global site tag (gtag.js) - Google Analytics