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等其他比支持的类型.