文档章节

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

vwarship
 vwarship
发布于 2015/03/01 07:57
字数 432
阅读 46
收藏 1
点赞 0
评论 0

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

Android 平台上轻量级的组件间通信框架 - Andromeda

Andromeda是爱奇艺开源的一个Android平台上轻量级的组件间通信框架,主要特征如下: 不需要开发者进行bindService操作,即可实现不同进程的任意两个组件间的IPC通信; 即使不在同一进程,也可同...

匿名 ⋅ 04/20 ⋅ 0

Android之AIDL进程之间的通信

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

zhoulc ⋅ 2014/02/12 ⋅ 1

android笔记--service与AIDL

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

哈全文 ⋅ 2012/04/28 ⋅ 0

Android进阶之AIDL的使用详解

原文首发于微信公众号:jzman-blog,欢迎关注交流! AIDL(Android 接口定义语言),可以使用它定义客户端与服务端进程间通信(IPC)的编程接口,在 Android 中,进程之间无法共享内存(用户...

jzman ⋅ 05/24 ⋅ 0

Android AIDL浅析及异步调用

AIDL:Android Interface Definition Language,即 Android 接口定义语言。 AIDL 是什么 Android 系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信。 为了使其...

cspecialy ⋅ 05/20 ⋅ 0

基于JSON RPC的一种Android跨进程调用解决方案了解一下?

基于JSON RPC的一种Android跨进程调用解决方案了解一下? 基于JSON RPC的一种Android跨进程调用解决方案了解一下? 简介 今天上午,看票圈有朋友分享爱奇艺的跨进程通信框架——Andromeda,觉...

流水不腐小夏 ⋅ 05/30 ⋅ 0

android跨进程通信(IPC):使用AIDL

AIDL的作用 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进...

长平狐 ⋅ 2013/12/25 ⋅ 0

Android进程间通信实践

因为线程间的内存是共享的,所以它们之间的通信简单,比如可以通过共享变量等方式实现。而进程间想要通信就要麻烦许多了。要想实现进程间通信,我们需要在不同进程之间定义一套它们可以共同理...

CPPAlien ⋅ 01/11 ⋅ 0

什么是aidl?Android AIDL详解

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

今幕明 ⋅ 2014/03/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 31分钟前 ⋅ 0

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明。 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个...

honeymose ⋅ 35分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 46分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 51分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 54分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 今天 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

only_full_group_by

我的mysql是在CentOS7.1下面的5.7.17 在 /etc/my.cnf 文件里加上如下: sql_mode='NO_ENGINE_SUBSTITUTION' 然后,重启Mysql服务 systemctl restart mysqld...

SunHacker ⋅ 今天 ⋅ 0

实际项目(SpringBoot项目)中集成Druid

参考网页 https://blog.csdn.net/liuchuanhong1/article/details/55050131 https://blog.csdn.net/CoffeeAndIce/article/details/78707819 https://www.pocketdigi.com/20170530/1577.html 为......

karma123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部