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

 更新时间:2016年03月14日 09:39:26   作者:水火379  
这篇文章主要介绍了Android中如何利用AIDL机制调用远程服务的相关资料,需要的朋友可以参考下

在Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然, Java中是不支持跨进程内存共享的。因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达到跨界对象访问的目的。在JavaEE中,采用RMI通过序列化传递对象。在Android中,则采用AIDL(Android Interface DefinitionLanguage:接口描述语言)方式实现。

AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现Android设备上的两个进程间通信(IPC)。AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后再转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类在背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。

服务端:

//CalculateInterface.aidl
package com.itheima.aidl.calculate;
interface CalculateInterface {
double doCalculate(double a, double b);
}
//CalculateService.java
package 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() {
@Override
public double doCalculate(double a, double b) throws RemoteException {
return a+b;
}
};
@Override
public IBinder onBind(Intent intent) {
Log.i("test","onBind...");
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
Log.i("test","onUnbind...");
return super.onUnbind(intent);
}
@Override
public void onCreate() {
super.onCreate();
Log.i("test","onCreate...");
}
@Override
public 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-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android: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.java
package 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() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("test","service disconnected...");
mService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i("test","service connected...");
mService = CalculateInterface.Stub.asInterface(service); //获取接口实例
}
};
@Override
protected 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加载完毕时回调此方法
@Override
public 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);
}
@Override
protected void onDestroy() {
unbindService(mServiceConnection); //解绑远程服务
super.onDestroy();
}
}

运行结果截图:

以上所述是小编给大家介绍的Android中如何利用AIDL机制调用远程服务的相关知识,希望对大家有所帮助!

相关文章

  • 支持多项选择的ExpandableListView

    支持多项选择的ExpandableListView

    这篇文章主要为大家详细介绍了支持多项选择的ExpandableListView,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Android中使用GridView和ImageViewSwitcher实现电子相册简单功能实例

    Android中使用GridView和ImageViewSwitcher实现电子相册简单功能实例

    本篇文章主要介绍了Android中使用GridView和ImageViewSwitcher实现电子相册简单功能实例,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • android中view手势滑动冲突的解决方法

    android中view手势滑动冲突的解决方法

    本篇文章主要介绍了android中view手势滑动冲突的解决方法,主要解决方法有两种,外部和内部拦截。有需要的可以参考下。
    2016-11-11
  • Android编程动态加载布局实例详解【附demo源码】

    Android编程动态加载布局实例详解【附demo源码】

    这篇文章主要介绍了Android编程动态加载布局,结合实例形式分析了Android动态加载布局的原理、操作步骤与相关实现技巧,需要的朋友可以参考下
    2016-10-10
  • Android this与Activity.this的区别

    Android this与Activity.this的区别

    这篇文章主要介绍了 Android this与Activity.this的区别的相关资料,需要的朋友可以参考下
    2016-09-09
  • Android ApplicationContext接口深入分析

    Android ApplicationContext接口深入分析

    ApplicationContext是Spring应用程序中的中央接口,由于继承了多个组件,使得ApplicationContext拥有了许多Spring的核心功能,如获取bean组件,注册监听事件,加载资源文件等
    2022-11-11
  • 详解Android事件的分发、拦截和执行

    详解Android事件的分发、拦截和执行

    这篇文章主要为大家详细介绍了详解Android事件的分发、拦截和执行,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android自定义view贝塞尔曲线

    Android自定义view贝塞尔曲线

    这篇文章主要为大家详细介绍了Android自定义view贝塞尔曲线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 安卓版微信小程序跳一跳辅助

    安卓版微信小程序跳一跳辅助

    这篇文章主要为大家详细介绍了安卓版微信小程序跳一跳辅助,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Kotlin Channel处理多个数据组合的流

    Kotlin Channel处理多个数据组合的流

    最近项目中对 kotlin 的使用比较多。不得不说 kotlin 确实可以极大的提高 android 的开发效率,channel用于协程之间的通讯,使用send和receive往通道里写入或者读取数据,2个方法为非阻塞挂起函数,channel是热流,不管有没有订阅者都会发送
    2022-11-11

最新评论