入门篇:10.Android中AIDL(安卓接口定义语言)跨应用操作Service

Posted 安卓随笔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了入门篇:10.Android中AIDL(安卓接口定义语言)跨应用操作Service相关的知识,希望对你有一定的参考价值。

android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。

为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。

--来自百度百科的解释

1.跨应用启动Service

(1)新建一个应用StartServiceFromAnotherApp

(2)在该应用中新建一个Service,AppService

(3)新建一个应用AnotherApp

       我们的目的是从这个应用中启动StartServiceFromAnotherApp中的AppService

(4)启动Appservice的代码为:

Intent i = new Intent();
i.setComponent(new ComponentName("要启动的service的包名","要启动的service类全称并带包名"));
startService(i);

(5)停止服务stopService(i)即可。

2.跨应用绑定service

(1)创建一个AIDL文件,Interface名为IAppServiceRemoteBinder,创建后会生成一个线程的类。

(2)在AppService中的onBind方法中重写:return new IAppServiceRemoteBinder.Stub();并实现其抽象方法。

(3)在AnotherApp里面启动第一个应用的AppService:

       bindService(i,this,Context.BIND_AUTO_CREATE);//这个i为上面所创建的Intent 对象,this需要实现两个方法onServiceConnected()和onServiceDIsconnected().

(4)停止服务:stopService(this);

3.跨应用绑定service并通信

(1)修改AIDL文件,添加一个抽象方法setData(String data)  

(2)此时AppService里面的onBind方法中IAppServiceRemoteBinder.Stub()会报错,因为需要实现上面抽象方法setData()

(3)在AppService中添加一个String类型的数据  String data = "默认数据";

(4)在setData方法中修改此数据

       AppService.this.data = data;

(5)创建线程状态变量 private boolean running = false;

(6)在onCreate方法里写一个线程,线程开始running = true ,其中的run方法中每隔一秒输出一下data

(7)在onDestory方法中running = false;

(8)回到AnotherApp,添加一个一个输入文本,和一个按钮,按钮为同步数据

(9)在AnotherApp中新建一个文件夹aidl,在aidl中添加一个包,包名为上述的aidl文件的包名,并且在包中复制一个aidl文件。

(10)在MainActivity中创建:private IAppServiceRemoteBinder binder = null;

(11)同步按钮执行:

if(binder!=null){
    try{
        binder.setData(input.getText().toString());
    }catch(RemoteException e){
        e.printStackTrace();
    }
}

(12)在onServiceConnected方法中添加:binder = IAppSerciveRemoteBinder.Stub.asInterface(service);

(13)解除绑定按钮添加:binder = null;

 

 

以上是关于入门篇:10.Android中AIDL(安卓接口定义语言)跨应用操作Service的主要内容,如果未能解决你的问题,请参考以下文章

Android AIDL(安卓接口定义语言)基本使用方法

Android AIDL(安卓接口定义语言)基本使用方法

安卓IPC跨进程通讯:AIDL+Retrofit——AndLinker的初步使用

AIDL简单示例

Android 进程通信机制之 AIDL

本地应用调用远程服务中的方法