文档章节

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

vwarship
 vwarship
发布于 2015/03/01 07:57
字数 432
阅读 120
收藏 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

粉丝 7
博文 2
码字总数 810
作品 8
济南
高级程序员
私信 提问
加载中

评论(0)

Android中实现跨进程通信(IPC)的几种方式(二)

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

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

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

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

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

今幕明
2014/03/04
3.2K
0
Android 进阶7:进程通信之 AIDL 的使用

读完本文你将了解: AIDL 是什么 AIDL 支持的数据类型 AIDL 如何编写 AIDL 实例 创建 AIDL 编写服务端代码 编写客户端代码 运行结果 总结 代码地址 Thanks 记得 2015 年实习面试,笔试题里就...

丁佳辉
2019/02/18
8
0
android之Service详解

服务--Service Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务的开发比较简单,如下: ...

长平狐
2012/09/03
522
0

没有更多内容

加载失败,请刷新页面

加载更多

1M带宽服务器并发数可支撑多少人同时在线?

服务器1M公网带宽能同时承受多少人同时在线?很多云厂商如阿里云、腾讯云推出的很多服务器活动默认配置1M带宽,很多站长认为服务器1M带宽小水管,事实上服务器1M带宽支撑日均2000IP的网站是够...

码笔记
昨天
18
0
C#简单入门——适合初学入门

一、第一个C#程序 using System;namespace HelloWorldApplication // 命名空间声明{ /* 类名为 HelloWorld */ class HelloWorld // 一个 class { /* main函数 ...

ittzg
昨天
9
0
DDD之2领域概念

图中是暗黑领域,非常牛逼的技能。 背景 DDD中出现的名词: 领域,子领域,核心域,通用域,支撑域,限界上下文,聚合,聚合根,实体,值对象 都是关键概念,但是又比较晦涩,在开始DDD之前,...

李福春carter
昨天
12
0
Vue基础学习备忘

内置指令 v-bind v-model v-if/v-else/v-show v-for v-on v-text v-html v-el v-ref v-pre v-cloak v-once 过滤器 作用是对数据再次加工,例如:后台返回时间戳,vue通过过滤器进行数据格式化...

Apache软件基金会主席
昨天
26
0
使用Git版本控制查看文件的更改历史记录 - View the change history of a file using Git versioning

问题: How can I view the change history of an individual file in Git, complete details with what has changed? 如何在Git中查看单个文件的更改历史记录,完整的详细信息? I have got......

技术盛宴
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部