Git: https://github.com/whtchl/AidlTemplate

AIDL用来做什么

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,对于小白来说,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。

AIDL的使用

在android studio 2.0里面使用AIDL,因为是两个APP交互么,所以当然要两个APP啦,我们在第一个工程目录右键

输入名称后,sutido就帮我们创建了一个AIDL文件。

// IMyAidlInterface.aidlpackage cc.abto.demo;// Declare any non-default types here with import statementsinterface IMyAidlInterface {    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,            double aDouble, String aString);}

上面就是studio帮我生成的aidl文件。basicTypes这个方法可以无视,看注解知道这个方法只是告诉你在AIDL中你可以使用的基本类型(int, long, boolean, float, double, String),因为这里是要跨进程通讯的,所以不是随便你自己定义的一个类型就可以在AIDL使用的,这些后面会说。我们在AIDL文件中定义一个我们要提供给第二个APP使用的接口。

interface IMyAidlInterface {   String getName();}

定义好之后,就可以sycn project一下,然后新建一个service。在service里面创建一个内部类,继承你刚才创建的AIDL的名称里的Stub类,并实现接口方法,在onBind返回内部类的实例。

public class MyService extends Service{    public MyService()    {    }    @Override    public IBinder onBind(Intent intent)    {        return new MyBinder();    }    class MyBinder extends IMyAidlInterface.Stub    {        @Override        public String getName() throws RemoteException        {            return "test";        }    }}

接下来,将我们的AIDL文件拷贝到第二个项目,然后sycn project一下工程。



这边的包名要跟第一个项目的一样哦,这之后在Activity中绑定服务。

public class MainActivity extends AppCompatActivity{    private IMyAidlInterface iMyAidlInterface;    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bindService(new Intent("cc.abto.server"), new ServiceConnection()        {            @Override            public void onServiceConnected(ComponentName name, IBinder service)            {                iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);            }            @Override            public void onServiceDisconnected(ComponentName name)            {            }        }, BIND_AUTO_CREATE);    }    public void onClick(View view)    {        try        {            Toast.makeText(MainActivity.this, iMyAidlInterface.getName(), Toast.LENGTH_SHORT).show();        }        catch (RemoteException e)        {            e.printStackTrace();        }    }}

这边我们通过隐式意图来绑定service,在onServiceConnected方法中通过IMyAidlInterface.Stub.asInterface(service)获取iMyAidlInterface对象,然后在onClick中调用iMyAidlInterface.getName()。


自定义类型

如果我要在AIDL中使用自定义的类型,要怎么做呢。首先我们的自定义类型要实现Parcelable接口,下面的代码中创建了一个User类并实现Parcelable接口。这边就不对Parcelable进行介绍了,不熟悉的童鞋自行查找资料,总之我们这边可以借助studio的Show Intention Action(也就是Eclipse中的Quick Fix,默认是alt+enter键)帮我们快速实现Parcelable接口。



接下新建一个aidl文件,名称为我们自定义类型的名称,这边是User.aidl。在User.aidl申明我们的自定义类型和它的完整包名,注意这边parcelable是小写的,不是Parcelable接口,一个自定类型需要一个这样同名的AIDL文件。

package cc.abto.demo;parcelable User;

然后再在我们的AIDL接口中导入我们的AIDL类型。



然后定义接口方法,sycn project后就可以在service中做具体实现了。

public class MyService extends Service{    //...    @Override    public IBinder onBind(Intent intent)    {        return new MyBinder();    }    class MyBinder extends IMyAidlInterface.Stub    {        //...        @Override        public User getUserName() throws RemoteException        {            return new User("wswf");        }    }}

最后将我们的AIDL文件和自定义类型的java一并拷贝到第二个项目,注意包名都要一样哦



然后就可以在Activity中使用该自定义类型的AIDL接口了

public class MainActivity extends AppCompatActivity{    //...    public void onClick(View view)    {        try        {            Toast.makeText(MainActivity.this, iMyAidlInterface.getUserName().getName(), Toast.LENGTH_SHORT).show();        }        catch (RemoteException e)        {            e.printStackTrace();        }    }}

效果图就不贴了哈,通过这种方式我们就可以让两个APP之间进行交互了。



更多相关文章

  1. android rom 修改订制 rom 解包 压包
  2. Ubuntu 下adb连接 android 设备
  3. Android(安卓)Lint 检查规则列表
  4. Android实现倒计时效果(天-时-分-秒)
  5. Android中集成QQ登陆和QQ好友分享及QQ空间分享
  6. android sqlite数据库时间 日期 double等数据类型
  7. Android(安卓)创建文件路径这件事,你也可能会犯的错误
  8. cocos2d-x在android中响应返回键编译报错的bug分析
  9. Android麦克风录音的实现

随机推荐

  1. Android设置全屏两种方式
  2. android Camera模块分析
  3. 自动 Android* 应用测试
  4. android source code下载源代码时出错
  5. android图片压缩工具类分享
  6. Android(安卓)使用Arcore 实现多点测距
  7. 来电铃声和通话中的提示音
  8. 每天学习一个Android中的常用框架——0.
  9. Android的消息通知--Notification
  10. Android(安卓)Gradle Task依赖