zoukankan      html  css  js  c++  java
  • 如何定义AIDL跨进程间通信

    当进程A要去调用进程B中的service时,并实现通信,我们通常都是通过AIDL来操作的

    projectA

    首先在我们自己的包com.wzp.aidlservice中创建一个RemoteService.aidl文件,在里面我们自己定义一个接口,含有方法getService()。ADT插件会在gen文件夹下自己主动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.Stub的内部类,该内部类中含有AIDL文件接口的getService()方法

    比如:

    package com.wzp.aidlservice;
    interface RemoteService { 
         String getService(); 
    }


    说明一:AIDL文件的位置不固定,能够随意,还有不要在定义接口中使用修饰符(private,public这些)

    接着,定义自己的MyService类,在MyService类中,定义一个内部类去继承RemoteService.Stub这个内部类。实现getService方法。在onBind方法中返回这个内部类的对象,系统会自己主动将这个对象封装成IBinder对象,传递给它的调用者。

    比如:

    public class MyService extends Service { 
    	public class MyServiceImpl extends RometeService.Stub { 
    		@Override 
    		public String getService() throws RemoteException { 
    			return "AIDL样例"; 
    		} 
    	} 
    	@Override 
    	public IBinder onBind(Intent intent) { 
    		return new MyServiceImpl(); 
    	}
    }
    在onBind方法一定要返回MyServiceImpl类的对象实例,不然调用者是获取不到服务对象的

    然后,须要在AndroidManifest.xml文件里配置MyService类。代码例如以下:

    <!-- 注冊服务 -->
    <service android:name=".MyService">
      <intent-filter>
       <!-- 指定调用AIDL服务的ID  -->
          <action android:name="com.wzp.aidlservice.RemoteService"/>
       </intent-filter>
    </service>

    指定调用AIDL服务的ID是为了告诉外界(其它进程)MyService这个类可以被别的进程訪问。仅仅要别的进程知道这个ID,就行实现通信。即本例中。进程B可以找到进程A实现通信。

    注意:AIDL并不须要权限


    projectB

    首先我们要将projectA中生成的RemoteService.java文件复制到projectB中。在bindService方法中绑定AIDL。服务绑定AIDL服务就是将RemoteService的ID作为intent的action參数。

    说明:假设我们单独将RemoteService.aidl文件放在一个包里。那么在我们将gen文件夹下的该包复制到projectB中。假设我们将RemoteService.aidl文件和我们的其它类存放在一起。那么我们在projectB中就要建立对应的包,以保证RmoteService.java文件的包名正确,并且我们不能改动RemoteService.java文件

    bindService(new Intent("com.wzp.aidlservice.RemoteService"),serviceConnection,Context.BIND_AUTO_CREATE);

    ServiceConnection的onServiceConnected(ComponentName name,IBinder service)方法中的service參数就是projectA中MyService类中继承了RemoteService.Stub类的内部类的对象。



    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Java中的静态方法
    捕获异常代码
    重载与重写的区别
    继承代码
    Android Studio 快捷键一览
    android两种基本联网方式与一种第三方开源项目的使用
    Android Studio导入github下载的project和module
    SlidingMenu 侧滑菜单的用法
    显示图片的(自定义)吐司Toast
    用volley在Genymotion上获取网页源码
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4673456.html
Copyright © 2011-2022 走看看