为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。
android studio创建AIDL服务文件具体步骤如下:
1、要进行创建AIDL的接口之前,需要进行选中当前的项目的文件中,选中完成项目之后。
2、然后进行点击Android studio菜单中的;file”的选项,就会弹出了一个下拉的菜单中;new”选项。
3、就会弹出了一个下一级的菜单中,进行选择下一级菜单中的;AIDL”的选项。
4、就会弹出了一个菜单中,进行点击这个菜单中的;AIDL FILE”的选项。
5、就会弹出了一个AIDL的窗口的选项,需要给接口进行添加名称,在interface name的输入框中进行输入名称,点击”finish;的选项。
6、然后在项目中进行天机了一个aidl的文件,在该文件下中,有一个aidl的后缀的文件,其实就是一个接口文件。
实例:
服务器端:
本例中将建立一个简单的AIDL服务。这个AIDL服务只有一个getValue方法,该方法返回一个String类型的值。在安装完服务后,会在客户端调用这个getValue方法,并将返回值在TextView组件中输出。建立这个AIDL服务的步骤如下:
(1)建立一个aidl文件。在Java包目录中建立一个IMyService.aidl文件。IMyService.aidl文件的位置如图所示。
IMyService.aidl文件的内容如下:
package cn.m9.mobile.aidl;
interface IMyService {
String getValue;
}
IMyService.aidl文件的内容与Java代码非常相似,但要注意,不能加修饰符(例如,public、private)、AIDL服务不支持的数据类型(例如,InputStream、OutputStream)等内容。
(2)如果IMyService.aidl文件中的内容输入正确,ADT会自动生成一个IMyService.java文件。读者一般并不需要关心这个文件的具体内容,也不需要维护这个文件。
(3)编写一个MyService类。MyService是Service的子类,在MyService类中定义了一个内嵌类(MyServiceImpl),该类是IMyService.Stub的子类。MyService类的代码如下:
package cn.m9.mobile.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
public String getValue
{
return "Android is very powerful";
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MyServiceImpl;
}
}
在编写上面代码时要注意如下两点:
IMyService.Stub是根据IMyService.aidl文件自动生成的,一般并不需要管这个类的内容,只需要编写一个继承于IMyService.Stub类的子类(MyServiceImpl类)即可。
onBind方法必须返回MyServiceImpl类的对象实例,否则客户端无法获得服务对象。
(4)在AndroidManifest.xml文件中配置MyService类,代码如下:
其中"cn.m9.activity.IMyService"是客户端用于访问AIDL服务的ID。
下面来编写客户端的调用代码。首先新建一个Eclipse Android工程(TestAidlClient),并将自动生成的IMyService.java文件连同包目录一起复制到 testAIDL_client工程的src目录中(R文件除外).
调用AIDL服务首先要绑定服务,然后才能获得服务对象,代码如下:
package cn.m9.mobile;
import cn.m9.mobile.R;
import cn.m9.mobile.aidl.IMyService;
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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class TestAidlClient extends Activity implements OnClickListener {
/** Called when the activity is first created. */
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private static final String TAG="TestAIDLClient";
private ServiceConnection serviceConnection = new ServiceConnection
{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService);
btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
switch (view.getId)
{
case R.id.btnBindAIDLService:
//绑定AIDL服务
bindService(new Intent("cn.m9.mobile.aidl.IMyService"), serviceConnection,Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try{
textView.setText(myService.getValue);
} catch (Exception e)
{
}
break;
}
}
}
在编写上面代码时应注意如下两点:
使用bindService方法来绑定AIDL服务。其中需要使用Intent对象指定AIDL服务的ID,也就是标签中android:name属性的值。
在绑定时需要一个ServiceConnection对象。创建ServiceConnection对象的过程中如果绑定成功,系统会调用onServiceConnected方法,通过该方法的service参数值可获得AIDL服务对象。
首先运行AIDL服务程序,然后运行客户端程序,单击【绑定AIDL服务】按钮,如果绑定成功,【调用AIDL服务】按钮会变为可选状态,单击这个按钮,会输出getValue方法的返回值.
找到桌面上的设置按钮或下滑通知栏右上方的设置按钮。进入设......
阅读soul的聊天记录删除后是无法恢复的,由于soul的聊天记录都会保......
阅读花呗收款二维码可以商家服务页面选项中找到,但是先需要开通......
阅读微信删除的账单是不可以恢复的,当删除账单的时候,会提示删......
阅读显示tim移动在线是手机上使用了TIM版本的QQ登录的账号,所以会......
阅读华硕ZenFone AR多少钱?大家是不是也想知道呢?那么华硕ZenFone AR配置怎么样呢?下面大家和出来小豆子一起来了解。...
次阅读
恢复目录功能。勾上要恢复的目录和文件,点恢复数据按钮,就可以把数据恢复到别的盘里面。 如果要恢复单个文件,在列表中右键点中一个文件,菜单选恢复当前选中的文件 请选择...
次阅读
安卓手机锁屏密码忘记了怎么办?如何用adb解锁手机锁屏 ? 今天教大家用ADB来删除密码 下载地址:http://www.pc6.com/softview/SoftView_65436.html 1.手机连接电脑,在充电模式下进行。 2.下载ADB解...
次阅读
2015年8月2500元左右的安卓智能手机推荐,很早以前,要是让你在洋品牌和自主品牌之间选择,相信大部分人会毫不犹豫的选择前者,因为那时国内手机厂商在制作工艺方面与洋品牌相差...
次阅读
另外有朋友反映说,手机QQ安卓版的自动登录密码,会在重启手机后无故丢失,关于这个问题我也遇到过,但是具体的原因不明,这里推测一下仅供参考,手机关机时,QQ还在后台运行,...
次阅读
Q:Android 5.0关屏动画与以前有什么不同? A:Android 5.0已经发布,这次的安卓系统跟以往有着很大的不同,可以说是谷歌对于安卓系统的一次跨越,那么Android 5.0关屏动画与以前有什么不同...
次阅读
小米max2新特性是什么?相信很多米粉对于小米max2的新特性很期待,下文带来小米max2新功能大全,一起和小乐哥来了解下吧!...
次阅读
第一步:首先我们找到桌面上的相机图标,点击相机 第二步:进入到相机页面,我们用手向右滑动 第三步:选择倒计时拍照, 第四步:我们发现在屏幕的下方出现了倒计时的选项,里...
次阅读
楼主你好!我知道红米2怎么设置锁屏密码,快来看一下吧。 1)打开红米2手机点击设置进入,然后再点击【锁屏和密码】,进入后再点击【屏幕密码】;(如下图) 2)进入设置锁界面绘制【锁...
次阅读
GPS数据怎么用? 小编首先可能要提醒大家,很多人可能在使用的时候,手机是没有办法显示,其他最简单的原因就是没有打开GPS定位,请先看2张比较图: 小编这里可以显示19颗卫星的,...
次阅读
ofo公主车怎么样?好骑吗?大家是不是也想知道ofo小黄车公主车在哪里呢?那么下面绿茶小豆子为大家详细ofo公主车位置!...
次阅读
1)下拉通知栏,按住【GPS定位】进入设置,在设置界面点击【其他系统设置】。(如下图) 2)点击【位置信息】进入,打开【开启位置服务】右边按钮即可。(如下图)...
次阅读
么么哒品牌旗下的首款手机----么么哒3S最大的一个卖点莫过于加入了眼纹识别功能,大家只需录入眼纹信息,便可实现眼纹解锁,使用十分快捷方便。相信大家对眼纹识别不会感到陌生...
次阅读
许多安卓手机用户都会发现,每次安装安卓手机软件时,都会弹出许多恼人的广告,那么,怎样才能安装软件时去除广告呢?以下就为大家带来安卓手机软件中的广告有效去除方法,具体...
次阅读
1)点击进入华为荣耀4C的设置,选择全部设置一栏,点击【开发人员选项】进入,找到并点击【后台进程限制】。(注:开启开发者选项请点击相关教程)(如下图) 2)根据自己的情况选择进...
次阅读