首页 > 系统 > Android > 正文

Android中如何利用AIDL机制调用远程服务

2020-01-02 07:00:14
字体:
来源:转载
供稿:网友

在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机制调用远程服务的相关知识,希望对大家有所帮助!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表