文档章节

使用binder-AIDL进行跨进程通信

tnjin
 tnjin
发布于 2015/06/13 13:45
字数 447
阅读 20
收藏 0

跨进程的binder通信即是使用AIDL的通信方式,AIDL的语法与java中的interface语法一致。

Service在声明的时候,如果android:process的value不是":"开头,则系统里有同样名字的进程的话,会放到已存在的同名进程里运行,这样能减小消耗;如果android:process的value是以":"开头,则启动一个以【当前包名:value】为名字的进程的进程。

我这里是用的新启动一个进程,AndroidManifest.xml中的服务声明如下:

<service
            android:name="com.test.multiprocesstest.BackService"
            android:process=":com.newearth.service" >
            <intent-filter>
                <action android:name="com.test.service" />
            </intent-filter>
        </service>

 

在源码目录下,创建一个扩展名为aidl的文件,则在Eclipse中会自动在gen文件夹下生成对应的java文件

其中IserviceProxy.aidl代码如下:

package com.test.multiprocesstest;
 
interface IServiceProxy {
    String test();
}

则在BackService.java 中用内部类实现此接口,并覆写onBind方法即可:

public class BackService extends Service{
       @Override
    public void onCreate() {
       super.onCreate();
       Log.i("SSSS","Service-create-PID:"+android.os.Process.myPid());
       //Log.i("SSSS",Student.name);
       Log.i("SSSS","service 创建");
       }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
       // TODO Auto-generated method stub
       Log.i("SSSS","service 启动");
       return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
       // TODO Auto-generated method stub
       return new InnerService();
    }
    @Override
    public void onDestroy() {
       // TODO Auto-generated method stub
       super.onDestroy();
       Log.i("SSSS","service被销毁");
    }
    public void test(){
       Log.i("SSSS","Service-test-PID:"+android.os.Process.myPid());
    }
       private class InnerService extends IServiceProxy.Stub{
 
       @Override
       public String test() throws RemoteException {
           // TODO Auto-generated method stub
           BackService.this.test();
           Log.i("SSSS","innerService--PID:"+android.os.Process.myPid());
           return "inner-service-test";
       }
       
    }
}

在MainActivity中用bind的方式启动service,需要一个ServiceConnection对象

Intent intent=new Intent("com.test.service");
     bindService(intent, new ServiceConnection() {
           
           @Override
           public void onServiceDisconnected(ComponentName name) {
              // TODO Auto-generated method stub    
           }
           
           @Override
           public void onServiceConnected(ComponentName name, IBinder service) {
              // TODO Auto-generated method stub
              IServiceProxy proxy= IServiceProxy.Stub.asInterface(service);
              try {
                  Log.i("SSSS","activity--getServicePID:"+proxy.test());
              } catch (RemoteException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              
           }
       }, Context.BIND_AUTO_CREATE);

这样即可做到两个进程间的通信。

 

© 著作权归作者所有

共有 人打赏支持
tnjin

tnjin

粉丝 27
博文 36
码字总数 28535
作品 0
海淀
Android工程师
Binder学习指南

转载自:http://blog.csdn.net/huangkun125/article/details/52184009 毫不夸张地说,Binder是Android系统中最重要的特性之一;正如其名“粘合剂”所喻,它是系统间各个组件的桥梁,Android...

lv18092081172
2016/12/01
0
0
Android中实现跨进程通信(IPC)的方式(三)之观察者模式

Android中实现跨进程通信(IPC)的方式(三)之观察者模式 前言     在Android中实现跨进程通信(IPC)的几种方式(一)中介绍了什么是多进程,为什么需要多进程,多进程的优缺点等。这篇我们将...

huangandroid
06/03
0
0
Android 使用Messenger跨进程通信框架

一.通过Binder绑定形式的通信 上一篇说道Binder机制的通信框架,也说过Messenger的底层实现自AIDL,因此对于跨进程通信中,Messenger是一种比较高级的框架,可以说对于一个app开发者来说重要性...

IamOkay
2014/12/04
0
0
Android Service之Messenger实现通信

从类Binder派生如果你的service是你自己应用的私有物,并且与客户端运行于同一个进程中(一般都这样),你应该通过从类Binder派生来创建你的接口并且从onBind()返回一它的实例.客户端接收这个...

KingMing
2016/04/05
166
0
Binder机制-简单用法(一)

Binder算是android里面比较难懂的部分了,但是非常重要,基本上,当我们深入到进程交互的阶段,Binder都是一个绕不开的槛,所以我也希望帮助大家更浅显地了解到这个知识点。笔者想通过3篇博文...

cjh94520
2017/05/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部