文档章节

使用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

没有更多内容

加载失败,请刷新页面

加载更多

关于SeekBar 拖动区域小的解决办法

//seekbarLayout 是seekBar对象statusSeekbar的父层布局seekbarLayout = mStatusViewLayout.findViewById(R.id.id_seekbar_layout);seekbarLayout.setOnTouchListener(new View.OnTouchL......

东街小霸王
38分钟前
2
0
python实现下载网络视频资源

项目需求: 有时候我们做爬虫的时候,需要把爬取到的视频资源保存到我们本地,以防爬取的视频链接被原来资源主人变更,所以就需要把好不容易拿到的资源永久变为自己的,就需要把视频链接下载到我们...

银装素裹
47分钟前
3
0
2.

三种ui窗口编译方式 C:\Users\hellopasswd>pyuic5 -o D:\testQtDesigner\firstMainWin.py D:\testQtDesigner\firstMainWin.ui import osimport os.pathdir ='./'def listUiFile(): ......

hellopasswd
48分钟前
2
0
写一个简单的运行Django项目的脚本

#!/bin/shecho -e "\033[32m killed original process \033[0m"project_name="tax_backend"env_name="tax_backend"echo "name = $name"ids=`ps -ef | grep "$project_name" | ......

易冥天
52分钟前
1
0
Kafka是如何解决常见的微服务通信问题的

微服务自成立以来就以不同的方式相互沟通。有些人更喜欢使用HTTP REST API,但这些API有自己的排队问题,而有些则更喜欢较旧的消息队列,比如RabbitMQ,它们带有扩展和操作方面的问题。 以K...

java菜分享
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部