文档章节

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详解

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

长平狐
2012/09/03
498
0
android跨进程通信(IPC):使用AIDL

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

长平狐
2013/12/25
242
0

没有更多内容

加载失败,请刷新页面

加载更多

stylus

stylus基础教程,stylus实例教程,stylus语法总结

miaojiangmin
36分钟前
3
0
PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
今天
2
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
今天
8
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
5
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部