Android远程服务(AIDL)实现步骤

AIDL是安卓接口定义语言的缩写

由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagename目录下,否则无法自动生成接口类文件

首先,编写我们的AIDL文件,定义接口方法,语法与JAVA略有不同

其次,我们要在建立的service类中建立实现了该AIDL文件名.stub类的子类,实现继承的方法。

在onbind方法中返回这个子类的一个实例

注册该服务,并给其一个ACTION,此ACTION就是以后访问该服务的ID

在ACTIVITY中,通过INTENT设立ACTION以及bindService的方法来启动该服务,需要注意的是,Android5.0中service的intent一定要显性声明,所以我们要给INTENT设置上我们现在的包名,使用上下文的GETPACKAGENAME即可,并建立一个ServiceConnection实例,实现该实例的方法,在onServiceConnected方法中可以通过其参数service来获得service传回的子类实例。

通过该实例,我们就可以调用服务中子类实例的方法了。

上面就是AIDL服务的建立和使用的简易教程

Activity

public class aidlactivity extends Activity{
    private IMyAidlInterface mys = null;

    public ServiceConnection sc = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mys = IMyAidlInterface.Stub.asInterface(service);
            if(mys != null) {
                try {
                    Toast.makeText(aidlactivity.this, mys.getvalue(), Toast.LENGTH_LONG).show();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                Log.v("sk", "not null");
            }


        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent();
        intent.setAction("com.xl.aild.myaidl");
        intent.setPackage(this.getPackageName());
        bindService(intent, sc, Context.BIND_AUTO_CREATE);
    }
}

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
   String getvalue();
}

AIDL文件↑

Servece文件

public class aidlservice extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        Log.v("sk", "return");
        return new myaidl();
    }

    class myaidl extends IMyAidlInterface.Stub {

        @Override
        public String getvalue() throws RemoteException {
            return "such a powerful aidl";
        }
    }
}

全称是:Android Interface Define Language

在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢?显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。

AIDL(AndRoid接口描述语言)是一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.

AIDL的创建方法:

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

1. 不需要import声明的简单Java编程语言类型(int,boolean等)

2. String, CharSequence不需要特殊声明

3. List, Map和Parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.

-----人若无名,则可专心练剑
原文地址:https://www.cnblogs.com/u3shadow/p/4271162.html