安卓AIDL简单详解

**最近我学习到安卓AIDL这篇文章,我又翻阅大佬的一些文章,整合我自己的了解来简单详解这篇文章。
AIDL简介
AIDL是 Android Interface definition language的缩写,我们从中可以看出有Interface,我们才知道AIDL是安卓接口定义语言,可以实现安卓设备中进程之间的通信,也可以用于单个service与多个程序之间进行跨进程通讯,从而实现多个应用使用单个service。
官方表达是:AIDL可以简化进程间数据格式转换和数据交换的代码,它允许在不同进程的调用者和Service之间相互传递数据,其属于轻量级的进程通信机制。
注意:
AIDL定义接口的源代码必须以.aidl结尾。
AIDL接口中用到的数据类型,除了基本类型、String、List、Map和CharSequence外,其他类均需要导入所在包,即使它们在同一个包中也需要导入包。
AIDL
优点:通讯速度快,支持实时通讯,支持一对多并发通讯,支持远程过程调用,系统底层直接共享内存,性能稳定,效率高。
缺点:使用复杂,需要创建AIDL文件,需要处理好线程同步问题。

话不多说,直接上案例:
在这里插入图片描述
这样直接创建安卓自带的AIDL,创建一个名为IMyAidlInterface的AIDL。
这是安卓会自动创建如下所示:
在这里插入图片描述
然后在IMyAidlInterface编写如下代码:

interface IMyAidlInterface {
    String getString();
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

然后创建一个名为MyService的服务,具体如何创建我之前讲过
链接: https://blog.csdn.net/jzdcuccess/article/details/105654145如果想看如何创建的可以点击连接。
MyService中的代码如下:

public class MyService extends Service {
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
    class MyBind extends IMyAidlInterface.Stub{
        public String getString() {
            String string="这就是所使用AIDL返回的结果";
            return string;
        }

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }


    }

    @Override
    public IBinder onBind(Intent intent) {
      return new  MyBind();
    }
}

之前绑定服务创建的MyBind是实现IBinder继承字Binder而现在是继承IMyAidlInterface.Stub。Stub是IMyAidlInterface中的一个静态抽象类,继承自Binder并实现IMyAidlInterface接口,其继承了android.os.Binder、
实现IaidlData接口故,我们实际需要实现的是Stub抽象类。
在java中编写如下代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button bind_service=(Button)findViewById(R.id.bind_service);
        Button unbind_service=(Button)findViewById(R.id.unbind_service);
        bind_service.setOnClickListener(this);
        unbind_service.setOnClickListener(this);
    }
    public ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            IMyAidlInterface myAidlInterface=IMyAidlInterface.Stub.asInterface(service);
            try {
                String str=myAidlInterface.getString();
                Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();

            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bind_service:
                Intent intent=new Intent();
                intent.setAction("com.example.aidl2.service");
                intent.setPackage("com.example.aidl2");
                bindService(intent,connection,BIND_AUTO_CREATE);
                break;
            case R.id.unbind_service:
               unbindService(connection);
                break;
             default:
                 break;

        }
    }
}

其它的和绑定服务一样,但是有一点不知道你们看出来了吗? intent.setPackage(“com.example.aidl2”);为什么要加入这一行代码呢?
setPackage()表示设置包名。
在AIDL中必须要指明包名,包名必须和java目录下的包名一致。
路径必须一致.如果你的实体类放在com.example.aidl2下,在aidl下也得新建的aidl放在此目录下.不然类无法找到,编译不通过.
最后别忘了在AndroidManifest.xml中配置:
在这里插入图片描述
一个简单的运用AIDL的案例就写完了。
如何错误,请斧正。

发布了9 篇原创文章 · 获赞 12 · 访问量 1321

猜你喜欢

转载自blog.csdn.net/jzdcuccess/article/details/105669107