时间:2021-05-20
在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然, Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在JavaEE中,采用RMI通过序列化传递对象。在Android中,则采用AIDL(Android Interface DefinitionLanguage:接口描述语言)方式实现。
AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。
服务端:
//CalculateInterface.aidlpackage com.itheima.aidl.calculate;interface CalculateInterface {double doCalculate(double a, double b);}//CalculateService.javapackage com.itheima.myaidl.server;import com.itheima.aidl.calculate.CalculateInterface;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;public class CalculateService extends Service{private final CalculateInterface.Stub mBinder = new CalculateInterface.Stub() {@Overridepublic double doCalculate(double a, double b) throws RemoteException {return a+b;}};@Overridepublic IBinder onBind(Intent intent) {Log.i("test","onBind...");return mBinder;}@Overridepublic boolean onUnbind(Intent intent) {Log.i("test","onUnbind...");return super.onUnbind(intent);}@Overridepublic void onCreate() {super.onCreate();Log.i("test","onCreate...");}@Overridepublic void onDestroy() {super.onDestroy();Log.i("test","onDestroy...");}}//服务端manifast文件<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.itheima.myaidl.server"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="19" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activity android:name="com.itheima.myaidl.server.MainActivity"android:configChanges="locale|layoutDirection"android:theme="@android:style/Theme.Light.NoTitleBar"android:screenOrientation="portrait"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:name="com.itheima.myaidl.server.CalculateService"><intent-filter><action android:name="com.itheima.myaidl.server.CalculateService" /></intent-filter></service></application></manifest>//客户端//MainActivity.javapackage com.itheima.myaidl.client;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import com.itheima.aidl.calculate.CalculateInterface;public class MainActivity extends Activity {private CalculateInterface mService;private ServiceConnection mServiceConnection = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i("test","service disconnected...");mService = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.i("test","service connected...");mService = CalculateInterface.Stub.asInterface(service); //获取接口实例}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//绑定远程服务Bundle bundle = new Bundle();Intent intent = new Intent();intent.putExtras(bundle);intent.setAction("com.itheima.myaidl.server.CalculateService");bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);}//TODO activity加载完毕时回调此方法@Overridepublic void onWindowFocusChanged(boolean hasFocus) {if(hasFocus){try{double result = mService.doCalculate(1, 2);Log.i("test","result===>"+result);}catch(RemoteException e){e.printStackTrace();}}super.onWindowFocusChanged(hasFocus);}@Overrideprotected void onDestroy() {unbindService(mServiceConnection); //解绑远程服务super.onDestroy();}}运行结果截图:
以上所述是小编给大家介绍的Android中如何利用AIDL机制调用远程服务的相关知识,希望对大家有所帮助!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android对这种方法进行了封装,我们没有权限去调用这个方法,所以我们只能通过AIDL,然后利用Java的反射机制去调用系统级的方法。下面上代码:(注释比较详
AIDL是Android中IPC(Inter-ProcessCommunication)方式中的一种,AIDL是AndroidInterfacedefiniti
Android:AIDL和远程Service调用本讲的内容,理解起来很难,也许你看了很多资料也看不明白,但是用起来缺简单的要命。所以我们干脆拿一个音乐播放器中进
AIDL的底层是通过Binder进行通信的,通过追踪.aidl编译后自动生成的文件我们知道,文件中的Stub类用于服务端,Proxy类用于客户端调用,那么可否直
为了方便网页和Android应用的交互,Android系统提供了WebView中JavaScript网页脚本调用Java类方法的机制。只要调用addJavasc