文档章节

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

tnjin
 tnjin
发布于 2015/06/13 13:45
字数 447
阅读 22
收藏 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
2018/06/03
0
0
02.Android之IPC机制问题

目录介绍 2.0.0.1 什么是Binder?为什么要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么? 2.0.0.2 Android中进程和线程的关系?什么是IPC?为何需要进行IPC?多进程通信...

潇湘剑雨
01/07
42
0
Android 使用Messenger跨进程通信框架

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

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

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

KingMing
2016/04/05
201
0

没有更多内容

加载失败,请刷新页面

加载更多

[mycat]PartitionByString分片报错

java.lang.RuntimeException: error,check your partitionScope definition.at io.mycat.route.util.PartitionUtil.<init>(PartitionUtil.java:69) PartitionUtil.java 注意:其中count,l......

Danni3
29分钟前
8
0
OSChina 周三乱弹 —— 魂淡!不是这种粪发涂墙

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小小编辑推荐歌曲《10/10》- Rex Orange County 《10/10》- Rex Orange County 手机党少年们想听歌,请使劲儿戳(这里) @奋斗的小牛 :上午...

小小编辑
42分钟前
740
10
Arduino教程:认识Arduino控制板

@toc 1.1 课程说明 认识Arduino控制板的各个部分, 1.2 器材 名称 数量 规格 Arduino uno控制板 1 R3 1.3 UNO电路: UNO参数 名称 参数说明 工作电压: 5V 输入电压: 接上USB时无须外部供电...

acktomas
48分钟前
6
0
WeUI框架

WeUI框架 WeUI是一套小程序的UI框架,所谓UI框架就是一套界面设计方案,有了组件,我们可以用它来拼接出一个内容丰富的小程序,而有了UI框架,我们就可以让我们的小程序变得更加美观。 体验W...

达达前端小酒馆
51分钟前
5
0
Rainbond 5.1.8发布,应用网关支持多IP网络接入

2019年10月23日,Rainbond发布5.1.8版本,本次版本更新带来了应用网关对多IP的支持, 第三方组件对域名实例的支持 等新功能和修复若干BUG。 Rainbond:支撑企业应用的开发、架构、交付和运维的...

好雨云帮
52分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部