进程间通信——AIDL实例演示

来源:互联网 发布:c语言画线函数 编辑:程序博客网 时间:2024/06/08 19:33

跨进程调用service(AIDL Service)

Leatrice 创建于20160418

 

Android系统中,各应用程序都运行在自己的进程中,进程之间一般无法直接进行数据交换。为了实现这种跨进程通信(Interprocess communication,简称ipc),Android提供了AIDL Service。

1.       定义远程通信接口

这种接口定义的语言不是一种真正的编程语言,它只是定义两个进程的通信接口,因此语法非常简单。

\packages\apps\MirrorSettings

里面定义了两个文件:INbSettingsService.aidl接口文件和

NbSettingsService.java服务

1)       INbSettingsService.aidl

interface INbSettingsService {        //定义接口

void switchCamera();   //定义方法

}

2)       NbSettingsService.java

public class NbSettingsServiceextends Service{

       privateNbSettingsBinder mIBinder;

       publicclass NbSettingsBinder extends INbSettingsService.Stub { //实现INbSettingsService接口,也实现了IBinder接口

             @Override

        public void switchCamera() throwsRemoteException {

 

              }

}

@Override

public void onCreate() {

     uper.onCreate();

      mIBinder = new NbSettingsBinder();

}

@Override

public IBinder onBind(Intent intent) {

     returnmIBinder;

}

}

2.       注册服务和接口

在MirrorSettings的android.mk文件里添加aidl接口:

LOCAL_SRC_FILES := \

       src/com/nb/forsystemui/INbSettingsService.aidl

在androidmainfest.mk里注册服务

<!-- Begin add by liting in20160418-->       

      <serviceandroid:name="com.nb.forsystemui.NbSettingsService" >           

             <intent-filter>               

             <actionandroid:name="com.nb.forsystemui.aidl.NBSETTINGS_SERVICES" />            

             </intent-filter>       

      </service>       

       <!--End add by liting in 20160418-->

3.       将接口暴露给客户端

上一步定义好AIDL接口之后,接下来就可定义一个Service实现类了,改Service的onBind()方法所返回的IBinder对象应该是ADT所生成的INbSettingsService.Stub的子类的实例。

1)       定义接口

\\frameworks\base\packages\SystemUI\src\com\nb\forsystemui

创建一个跟在服务端一样的包一样的接口INbSettingsService.aidl

2)       注册接口

在android.mk文件里添加如下:

LOCAL_SRC_FILES +=src/com/nb/forsystemui/INbSettingsService.aidl

3)       客户端绑定远程Service

a)       创建ServiceConnection对象

private ServiceConnectionsettingsConn = new ServiceConnection() {

  @Override

  publicvoid onServiceDisconnected(ComponentNamename) {

        mSettingsService = null;

   }

   @Override

   publicvoid onServiceConnected(ComponentNamename, IBinder service) {

//获取远程Service的onBind方法返回的对象的代理

         mSettingsService=INbSettingsService.Stub.asInterface(service);

       }

};

b)       以ServiceConnection对象作为参数,调用Context的bindService()方法绑定远程Service即可

Intent bindIntent = new

Intent("com.nb.forsystemui.aidl.NBSETTINGS_SERVICES");

           bindIntent.setComponent(new ComponentName(

                   "com.android.settings","com.nb.forsystemui.NbSettingsService"));

            mContext.bindService(bindIntent, settingsConn,Service.BIND_AUTO_CREATE);

c)       调用aidl方法

try{

        mSettingsService.switchCamera();

}catch(Exception e){

                    //e.printStack();

          }

0 0
原创粉丝点击