Android之AIDL服务


AIDL服务

       服务(Service)是android系统中非常重要的组件。Service可以脱离应用程序运行。也就是说,应用程序只起到一个启动Service的作用。一但Service被启动,就算应用程序关闭,Service仍然会在后台运行。

       android系统中的Service主要有两个作用:后台运行和跨进程通讯。后台运行就不用说了,当Service启动后,就可以在Service对象中 运行相应的业务代码,而这一切用户并不会察觉。而跨进程通讯是这一节的主题。如果想让应用程序可以跨进程通讯,就要使用我们这节讲的AIDL服 务,AIDL的全称是Android Interface Definition Language,也就是说,AIDL实际上是一种接口定义语言。通过这种语言定义接口后,Eclipse插件(ODT)会自动生成相应的Java代码接 口代码。下面来看一下编写一个AIDL服务的基本步骤。

1.  在Eclipse工程的package目录中建立一个扩展名为aidl的文件。package目录就是Java类所在的目录。该文件的语法类似于Java代码。aidl文件中定义的是AIDL服务的接口。这个接口需要在调用AIDL服务的程序中访问。
2.  如果aidl文件的内容是正确的,Eclipse插件会自动生成一个Java接口文件(*.java)。
3.  建立一个服务类(Service的子类)。
4.  实现由aidl文件生成的Java接口。
5.  在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,<action>标签的android:name属性值就是客户端要引用该服务的ID,也就是Intent类构造方法的参数值。

      现在我们来编写一个AIDL服务,首先建立一个android工程:aidlservice。在aidlservice工程中有一个Main类,在Main类所有的目录建立一个IMyService.aidl文件,内容如下:

 package  net.blogjava.mobile.aidlservice;  
interface  IMyService  
{  String getValue();  //  为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法   
} 
    package net.blogjava.mobile.aidlservice;  interface IMyService  {  String getValue();  //  为AIDL服务的接口方法,调用AIDL服务的程序需要调用该方法  }  
在保存IMyService.aidl文件后,ODT会在gen目录下产生一个IMyService.java文件,读者可以不必管这个文件中的内容,也 不需要修改该文件的内容。这个文件是由ODT自动维护的,只要修改了IMyService.aidl文件的内容,IMyService.java文件的内 容就会随之改变。

        然后建立一个MyService类,该类是Service的子类,代码如下:

    package  net.blogjava.mobile.aidlservice;  ... ...  public  class  MyService extends  Service  {  //  IMyService.Stub类是根据IMyService.aidl文件生成的类,该类中包含了接口方法(getValue)   public  class  MyServiceImpl extends  IMyService.Stub  {  @Override   public  String getValue() throws  RemoteException  {  return  "从AIDL服务获得的值." ;  }  }  @Override   public  IBinder onBind(Intent intent)  {          //  该方法必须返回MyServiceImpl类的对象实例   return  new  MyServiceImpl();  }  }  
    package net.blogjava.mobile.aidlservice;  ... ...  public class MyService extends Service  {  //  IMyService.Stub类是根据IMyService.aidl文件生成的类,该类中包含了接口方法(getValue)  public class MyServiceImpl extends IMyService.Stub  {  @Override  public String getValue() throws RemoteException  {  return "从AIDL服务获得的值.";  }  }  @Override  public IBinder onBind(Intent intent)  {          //  该方法必须返回MyServiceImpl类的对象实例  return new MyServiceImpl();  }  }  
最后需要在AndroidManifest.xml文件中配置MyService类,代码如下:

    <!--  注册服务 -->  <service android:name=".MyService" >  <intent-filter>  <!--  指定调用AIDL服务的ID  -->  <action android:name="net.blogjava.mobile.aidlservice.IMyService"  />  </intent-filter>  </service>  

    <!--  注册服务 -->  <service android:name=".MyService">  <intent-filter>  <!--  指定调用AIDL服务的ID  -->  <action android:name="net.blogjava.mobile.aidlservice.IMyService" />  </intent-filter>  </service>  
下面来看看如何调用这个AIDL服务。首先建立一个android工程:aidlclient。然后将aidlservice工程中自动生成的 IMyService.java文件复制到aidlclient工程中。在调用AIDL服务之前需要先使用bindService方法绑定AIDL服务。 bindService方法需要一个ServiceConnection对象。ServiceConnection有一个 onServiceConnected方法,当成功绑定AIDL服务且,该方法被调用。并通过service参数返回AIDL服务对象。下面是调用 AIDL服务的完成代码。

 package  net.blogjava.mobile.aidlclient;  
... ...  
public  class  Main extends  Activity implements  OnClickListener  
{  
private  IMyService myService = null ;  
//  创建ServiceConnection对象   private  ServiceConnection serviceConnection = new  ServiceConnection()  {  @Override   public  void  onServiceConnected(ComponentName name, IBinder service)  {  // 获得AIDL服务对象   myService = IMyService.Stub.asInterface(service);  try   {  //  调用AIDL服务对象中的getValue方法,并以对话框中显示该方法的返回值   new  AlertDialog.Builder(Main.this ).setMessage(  myService.getValue()).setPositiveButton("确定" , null )  .show();  }  catch  (Exception e)  {  }  }  @Override   public  void  onServiceDisconnected(ComponentName name)  {  }  };  @Override   public  void  onClick(View view)  
{  //  绑定AIDL服务   bindService(new  Intent("net.blogjava.mobile.aidlservice.IMyService" ),  serviceConnection, Context.BIND_AUTO_CREATE);  }  ... ...  
} 
    package net.blogjava.mobile.aidlclient;  ... ...  public class Main extends Activity implements OnClickListener  {  private IMyService myService = null;  //  创建ServiceConnection对象  private ServiceConnection serviceConnection = new ServiceConnection()  {  @Override  public void onServiceConnected(ComponentName name, IBinder service)  {  // 获得AIDL服务对象  myService = IMyService.Stub.asInterface(service);  try  {  //  调用AIDL服务对象中的getValue方法,并以对话框中显示该方法的返回值  new AlertDialog.Builder(Main.this).setMessage(  myService.getValue()).setPositiveButton("确定", null)  .show();  }  catch (Exception e)  {  }  }  @Override  public void onServiceDisconnected(ComponentName name)  {  }  };  @Override  public void onClick(View view)  {  //  绑定AIDL服务  bindService(new Intent("net.blogjava.mobile.aidlservice.IMyService"),  serviceConnection, Context.BIND_AUTO_CREATE);  }  ... ...  }  

在编写AIDL服务和客户端时要注意如下两点:

1.  AIDL服务中的onBind方法必须返回AIDL接口对象(MyServiceImpl对象)。该对象也是onServiceConnected事件方法的第2个参数值。
2.  bindService方法的第1个参数是Intent对象,该对象构造方法的参数需要指定AIDL服务的ID,也就是在 AndroidManifest.xml文件中<service>标签的<action>子标签的android:name属性 的值。

 现在先运行aidlservice程序,以便安装AIDL服务,然后运行aidlclient程序,并单击按钮,会显示如图11所示的对话框。对话框中的信息就是AIDL服务接口中getValue方法的返回值。

总结 
      本文介绍了4种跨进程通讯的方式:Activity、ContentProvider、Broadcast和AIDL Service。其中Activity可以跨进程调用其他应用程序的Activity;ContentProvider可以访问其他应用程序返回的 Cursor对象;Broadcast采用的是被动接收的方法,也就是说,客户端只能接收广播数据,而不能向发送广播的程序发送信息。AIDL Service可以将程序中的某个接口公开,这样在其他的应用程序中就可以象访问本地对象一样访问AIDL服务对象了。这4种跨进程通讯的方式可以应用在 不同的场合,例如,在需要显示可视化的界面时可以用Activity,需要返回记录集时可以用ContentProvider。至于在应用程序中具体要用 到哪一种或几种方式进行跨进程通讯,读者可以根据实际情况进行选择。








本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

男人的那些统一话术......

1 当面试官来租你的房子▼2 好家伙&#xff08;via.dy油画艺术&#xff09;▼3 学到了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 一杯奶茶能加多少料▼5 原来我们如此优秀&#xff01;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼6 幼儿园里卧…

后端开发者开发前端必会的工具(一):样式调试篇

又来为大家分享干货了&#xff0c;今天主要是分享一点关于后端工程师开发前端比较苦恼的一个问题《如何去调试前端&#xff1f;》&#xff0c;我相信这是所有后端开发者比较困惑的&#xff0c;如果有这个困惑的&#xff0c;记得关注“程序员晓晓”公众号&#xff0c;并给我留言…

adb android源码分析,Android源码分析(十六)----adb shell 命令进行OTA升级

一: 进入shell命令界面adb shell二&#xff1a;创建目录/cache/recoverymkdir /cache/recovery 如果系统中已有此目录&#xff0c;则会提示已存在。三: 修改文件夹权限chmod -R 777 /cache/recovery四: 把ota文件路径写入/cache/recovery/command文件中echo "--update_pac…

如何使用cURL获得请求和响应时间?

✎ 码甲说 hello&#xff0c;老伙计们&#xff0c;又有半个多月没见了&#xff0c;今天给大家分享一个干货编程小技巧&#xff0c;上至架构师、下至开发者、运维男、QA&#xff0c; 得此利器&#xff0c;事半功倍。cURL在我的眼里&#xff0c;就是一个httpClient手办&#xff…

ASP.NET MVC CheckBoxFor为什么会生成hidden input控件

自己开发的公众号&#xff0c;可以领取淘宝内部优惠券 Html.CheckBoxFor(m > m.Bool) 使用CheckBoxFor方法得到的html代码会是下面这个样子 <input checked"checked" data-val"true" data-val-required"Bool 字段是必需的。" id"Bool…

android 远程调试工具,Android远程调试的探索与实现

文章来源&#xff1a;美团点评技术团队作为移动开发者&#xff0c;最头疼的莫过于遇到产品上线以后出现了bug&#xff0c;但是本地开发环境又无法复现的情况。常见的调查线上棘手问题方式大概如下&#xff1a;方法优点缺点联系用户安装已添加测试日志的APK方便定位问题需要用户…

.NET 6新特性试用 | 自动生成高性能日志记录代码

前言要想记录日志&#xff0c;常用的方式是访问ILogger实例提供的日志记录方法&#xff1a;private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger) {_logger logger; }[Htt…

3150 Pibonacci数 - Wikioi

题目描述 Description   你可能听说过的Fibonacci数和圆周率Pi。   如果你让这两个概念合并&#xff0c;一个新的深奥的概念应运而生&#xff1a;Pibonacci数。   这些数可以被定义为对于x>0&#xff1a;     如果0<x<4&#xff0c;则P(x) 1 …

Oracle Enterprises Manager 12C安装

前言 随着时代的进步与发展&#xff0c;Oracle官方于2012年12月1日起正式公布不再为Oracle10g版本提供免费的技术支持服务&#xff0c;而另一款新产品12C也即将面试&#xff0c;C即cloud&#xff0c;伴随着云计算的脚步&#xff0c;他终于粉墨登场了&#xff0c;熊熊第一时间下…

一个简单的MVC模式练习

控制层Action接受从模型层DAO传来的数据&#xff0c;显现在视图层上。 package Action;import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement;import DAO.StuDAO; import Model.Student; import Util.DBUtil;public class StuAction {public …

GraphQL 到底有什么魔力?

GraphQL 起源时间退回到 2012年的一个下午, 美国加利福尼亚州, facebook 的工程师们发现他们才上架没多久的移动端应用就收到了很多差评, 用户反映app响应慢&#xff0c;耗电严重等&#xff0c;经过分析后发现, 应用在第一次启动时, 会请求大量的后端api接口, 这其中包括用户自…

android root工具twrp,安卓手机没有twrp的情况,如何下刷入magisk并获得root权限.

安装adb工具从以上地址下载,然后解压到任意目录(例如C:\adb).将此目录添加到windows环境变量path中.在cmd中输入adb, fastboot等命令,如果"显示"xxx"不是内部或外部命令命令",那么说明你弄错了,去了解一下什么是环境变量吧.如果显示一堆英文,那么说明安装完…

VBA即用型代码手册之打开有密码保护的工作薄

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

⑥又是星期五,小试牛刀(编写定制标签)

前言 今天有点迷茫。是身体累了&#xff0c;还是心累了。有种觉得想大哭而无力的感觉&#xff08;可能心还没成熟,或是昨天羽毛球打累了&#xff09;。加油&#xff0c;Jeff Li. 活在当下&#xff0c;坚持打好基础&#xff0c;坚持刷ACM&#xff0c;坚持coding。 今天下午的小故…

技术分享|前端性能 关键性能指标以及测量工具介绍

源宝导读&#xff1a;对于一款商业软件产品而言&#xff0c;其性能表现往往会直接关系到它的生死存亡&#xff0c;这种说法一点也不夸张&#xff0c;数据显示&#xff0c;40&#xff05;的人放弃了加载时间超过3秒的网站。但是一个网页的加载时间&#xff0c;响应时间的“快”“…

ELKstack-Elasticsearch各类安装部署方法

手动安装部署Elasticsearch 开篇 开篇闲话&#xff0c;如果是新人在接触ELKstack什么都不懂的情况下&#xff0c;可以先看看各位前人写的关于ELKstack的博客&#xff0c;如何对ELKstack部署安装及使用&#xff0c;但是别人的东西只能作为借鉴&#xff0c;在自己搭建使用一定要以…

美国超人气漫画科普书!85%以上中学物理考点,5岁孩子秒懂物理

▲ 点击查看今年的高考&#xff0c;不得不说&#xff0c;一度被浙江学霸刷屏&#xff01;他总分720分&#xff0c;物理等3门满分的成绩&#xff0c;最终获得“浙江高考状元”。状元能摘得桂冠&#xff0c;除了日积月累的不断努力外&#xff0c;最重要的是&#xff0c;不断调整自…