文档章节

Android 使用 AIDL 实现进程间通信,使用基本类型作为输入和输出参数

vwarship
 vwarship
发布于 2015/03/01 07:57
字数 432
阅读 62
收藏 1

RemoteService

1. 定义 IRemoteService.aidl

package com.zaoqibu.remoteservice;// Declare any non-default types here with import statementsinterface IRemoteService {    /** Request the process ID of this service, to do evil things with it. */
    int getPid();    /** Demonstrates some basic types that you can use as parameters and return values in AIDL. */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);
}

  • 定义了两个方法,输入和输出参数都是简单类型(int, long, boolean, float, double, String)。

  • 编译程序,将会在 build/generated/ 目录下生成 IRemoteService.java 的文件,里面有 IRemoteService.Stub 服务的存根代理类。

AIDL 所在目录

2. 创建服务 RemoteService 类

public class RemoteService extends Service {    private static final String TAG = "RemoteService";    @Override
    public void onCreate() {        super.onCreate();
    }    @Override
    public IBinder onBind(Intent intent) {        return binder;
    }    private final IRemoteService.Stub binder = new IRemoteService.Stub() {        public int getPid(){            return Process.myPid();
        }        public void basicTypes(int anInt, long aLong, boolean aBoolean,                               float aFloat, double aDouble, String aString) {            String str = String.format("anInt:%d, aLong:%d, aBoolean:%b, aFloat:%f, aDouble:%f, aString:%s",
                    anInt, aLong, aBoolean, aFloat, aDouble, aString);            Log.i(TAG, str);
        }
    };

}

  • 实现存根代理类 IRemoteService.Stub。

3. 在 AndroidManifest.xml 中声明 RemoteService

        <service android:name=".RemoteService" android:process=":remote">
            <intent-filter>                <!-- These are the interfaces supported by the service, which you can bind to. -->
                <action android:name="com.zaoqibu.remoteservice.IRemoteService" />
            </intent-filter>
        </service>

Client

1. 从 RemoteService 工程中拷贝 IRemoteService.aidl 文件

AIDL 所在目录

  • 保持原路径

2. 调用 IRemoteService 方法。

public class MainActivity extends ActionBarActivity {    private static final String TAG = "MainActivity";    private IRemoteService iremoteService;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bindService(new Intent(IRemoteService.class.getName()), serviceConnection, BIND_AUTO_CREATE);
    }    private ServiceConnection serviceConnection = new ServiceConnection() {        // Called when the connection with the service is established
        public void onServiceConnected(ComponentName className, IBinder service) {            // Following the example above for an AIDL interface,
            // this gets an instance of the IRemoteInterface, which we can use to call on the service
            iremoteService = IRemoteService.Stub.asInterface(service);
        }        // Called when the connection with the service disconnects unexpectedly
        public void onServiceDisconnected(ComponentName className) {            Log.e(TAG, "Service has unexpectedly disconnected");
            iremoteService = null;
        }
    };    public void onRemoteServiceProcessIDClick(View view) {        int processID = 0;        try {
            processID = iremoteService.getPid();

            iremoteService.basicTypes(1, 2, true, 3.3f, 4.4, "hello");
        } catch (RemoteException e) {
            e.printStackTrace();
        }        TextView remoteServiceProcessID = (TextView)findViewById(R.id.remoteServiceProcessID);
        remoteServiceProcessID.setText(String.valueOf(processID));
    }

}


3. 运行


© 著作权归作者所有

共有 人打赏支持
vwarship

vwarship

粉丝 6
博文 2
码字总数 810
作品 8
济南
高级程序员
Android中实现跨进程通信(IPC)的几种方式(二)

Android中实现跨进程通信(IPC)的几种方式(二)     在上一篇文章中介绍了什么是多进程,为什么需要多进程,多进程的优缺点等。这篇我们将会使用AIDL来实现跨进程通信。 1.什么是AIDL  ...

huangandroid
05/26
0
0
Android之AIDL进程之间的通信

意义: 由于每个应用进程都有自己的独立进程空间,在android平台上,一个进程通常不能访问另一个进程的内存空间,而我们经常需要夸进程传递对象,就需要把对象分解成操作对象可以理解的基本单...

zhoulc
2014/02/12
0
1
什么是aidl?Android AIDL详解

什么是aidl: aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 icp:interprocess commu...

今幕明
2014/03/04
0
0
android笔记--service与AIDL

Service是android中的服务组件, 经常用来执行一些运行在后台的耗时操作. 使用一个Service需要继承Service类, 并根据需要重写生命周期方法. Service的生命周期如下: |-- public abstract IBi...

哈全文
2012/04/28
0
0
Android安全模型之Android安全机制(进程通信)

进程通信是应用程序进程之间通过操作系统交换数据与服务对象的机制。Linux操作系统的传统进程间通信(IPC)有多种方式,比如管道,命令管道,信号量,共享内存,消息队列,以及网络与Unix套接...

柳哥
2014/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

golang使用protobuf简易教程

参考文档:https://blog.csdn.net/qq_15437667/article/details/78425151 一、安装protobuf # 去github.com/golang/protobuf下载源码包,# 拷贝到 $GOPATH/src/github.com/golang/protobuf......

科陆李明
昨天
0
0
8月16日 上课截图

小丑鱼00
昨天
0
0
Nginx负载均衡、配置SSL

Nginx负载均衡 在 /usr/local/nginx/conf/vhost/ 下创建一个文件,写入以下内容 加载后用curl测试可以访问设置的网站 www.qq.com ssl原理 HTTPS是一种加密的http协议,如果HTTP通信的数据包在...

黄昏残影
昨天
0
0
String 源码阅读笔记

String源码阅读 本人学习笔记,内容来自于阅读源码和其他博客,水平有限,如有错误,烦请指正。 详情参考: Java 7 源码学习系列(一)——String 请别再拿“String s = new String("xyz");...

等到烟火清凉_
昨天
4
0
Coding and Paper Letter(十二)

资源整理。<!-- more --> 1 Coding: 1.R语言生成的ppt,GeoStat2018会议报告,时空模式分析的报告。 geostat18 2.欧空局哨兵和SMOS的工具集,关于对地观测数据的处理与分析的docker容器。 ...

胖胖雕
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部