android 跨进程Service调用

转自:http://blog.csdn.net/olanmomo/article/details/39830833


跨进程Service调用



跨进程Service调用,即在当前应用程序中,调用另一个应用程序中的Service。

因为Android中,每个应用程序都运行于自己的进程中,拥有独立的Dalvik虚拟机实例,因而称为跨进程调用(Inter-Process Comunication)。

可通过AIDL服务来实现。

AIDL(Android Interface Definition Language),是Android定义的一种类似Java的语言。主要用于定义跨进程调用时,服务端跟客户端用于数据交互的接口。

AIDL服务并不支持所有的Java数据类型。它只支持以下的几种类型:
1、Java的简单类型(int, char, boolean等)。无需import
2、String和CharSequence。无需import
3、List和Map。无需import(应当注意的是:List和Map的元素类型必须是AIDL支持的)
4、AIDL自动生成的接口。需要import
5、实现android.os.Parcelable接口的类。需要import

建立简单的AIDL服务的步骤如下:
(一)服务端步骤:
1、在服务端创建AIDL文件IMyAidl.aidl
AIDL与Java代码很相近,示例代码如下:(注意:aidl文件后缀名为.aidl)
package com.thomas.aidlserver;
interface IMyAidl
{
void print();
}
创建完aidl文件后,ADT会自动调用aidl命令生成相应的Java文件。可查看gen文件夹下是否有一个名为IMyAidl.java的文件。如果没有,说明.aidl文件有误。

2、继承Service类,在子类中,将AIDL接口暴露出来。
这一步类似于本地Service调用,则通过onBind(Intent intent)方法返回一个IBinder对象。
示例代码如下:
public class MyService extends Service
{
private AidlBinder mBinder;

//Stub类是上一步骤中,aidl命令生成的Java代码中的一个类
//该类实现了IBinder接口和IMyAidl接口
//可以通过继承该类,然后在onBind()方法中返回AidlBinder对象
//如此一来,即可通过AidlBinder对象对AIDL文件中定义的方法进行调用
public class AidlBinder extends Stub
{
@Override
public void print()
{
System.out.println("Hello world!")//实现AIDL文件中的接口函数
}
}

@Override
public void onCreate()
{
mBinder = new AidlBinder();//启动服务时即创建Binder对象
}

@Override
public IBinder onBind(Intent intent)
{
return mBinder;//返回Binder对象,让客户端获得Binder对象
}
}

3、配置AndroidManifest.xml文件
<!-- 自定义访问Service所需的权限 -->
<permission android:protectLevel="normal" android:name="thomas.permission.AIDL_SERVICE"/>

<service android:name="com.thomas.aidlserver.MyService" android:exported="true"
android:permission="thomas.permission.AIDL_SERVICE">
<!-- IntentFilter属性是必不可少的 -->
<!-- 如此一来,客户端才能通过该action远程调用服务端的Service -->
<intent-filter>
<action android:name="com.thomas.aidlserver.action.AIDL_SERVICE"/>
</intent-filter>
</service>

(二)客户端步骤:
1、创建AIDL文件
客户端也要创建AIDL文件,而且是跟服务端完全一样的AIDL文件。
复制服务端AIDL文件即可。应当注意的是:AIDL文件的包名一定要跟服务端的一致。
如果客户端没有该包,应创建一个包,并将AIDL文件放到包下。

2、跨进程调用Service
客户端跨进程调用Service的方法与本地调用Service的方法差不多,也是通过bindService()。
应当注意的是,调用成功后,通过ServiceConnection接口中的onServiceConnected(ComponentName name, IBinder service)方法得到服务端onBind()方法传递过来的Binder对象。将该对象类型转化为AIDL文件中声明的接口类型,即可调用该接口中定义的方法。
示例代码如下:

private IMyAidl mAidl;
mServiceCon = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
//将IBinder类型转化为IMyAidl类型。
mAidl = IMyAidl.Stub.asInterface(service);
}
@Override
public void onServiceDisonnected(ComponentName name){}
}

//远程Service绑定,其中Intent的action参数是服务端在
//AndroidManifest.xml文件中<service>标签下的<intent-filter>指定的字符串
bindService(new Intent("com.thomas.aidlserver.action.AIDL_SERVICE"),
mServiceCon, Service.BIND_AUTO_CREATE);

mAidl.print();//调用AIDL文件中声明的方法

3、配置AndroidManifest.xml文件
<!-- 请求访问远程Service所需的权限,该权限定义于服务端的AndroidManifest.xml文件中 -->
<uses-permission android:name="thomas.permission.AIDL_SERVICE"/>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值