文档章节

使用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
2018/06/03
0
0
Android 使用Messenger跨进程通信框架

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

IamOkay
2014/12/04
0
0
02.Android之IPC机制问题

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

潇湘剑雨
01/07
0
0
Android Service之Messenger实现通信

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

KingMing
2016/04/05
166
0

没有更多内容

加载失败,请刷新页面

加载更多

使用Airflow来调度Data Lake Analytics的任务

今天我们来介绍一下使用Airflow来调度 Data Lake Analytics(后面简称DLA)的任务执行。DLA作为一个数据湖的解决方案, 客户有每天周期性的调度一些任务从DLA查询数据回流到业务系统的需求。因...

迷你芊宝宝
27分钟前
3
0
简单的file获取文本内容且, 修改文本内容(java8)

题主, 因入职新公司, 表设计混乱, 不得不手动写一个小脚本,获取所有字段后,重新写入至新表中; 思路 顺序如下 原sql 具体, 获取行 , 根据行开头的" ,"截取内容, 重新输入到txt, 中就可以了; 代...

尾生
34分钟前
3
0
嵌入式编程(一):51单片机如何将函数 定义到指定程序地址

在单片机编程使用中,会涉及到将某些函数定义到指定的code区。此时需要对工程文件进行配置修改才可完成。本期针对单片机平台做出说明介绍 1、测试目标 将函数testaddr定义到0x6000地址 2、测...

Music121
38分钟前
1
0
Java Android几个重要的基础知识

Java 1.数据类型 bit(位):0或1计算机存储处理信息的最基本的单位 byte(字节):8个bit(上面表格数字的单位是byte) 2. m与n数值交换 //m=2,n=3; m=m^n; //m=2^3 n =m^n; //n =2^3^3=2 m=m...

Coding缘
40分钟前
4
0
好程序员教程之配置H5的滚动条样式示例代码

配置H5的滚动条样式示例代码有不少的小伙伴在网上寻找,本篇文章好程序员小编和大家分享一下配置H5的滚动条样式示例代码,希望对HTML5开发感兴趣的小伙伴有所帮助,下面我们一块来看一下吧:...

好程序员IT
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部