多进程通讯笔记 android aidl

环境

android studio 2.2

步骤:创建aidl文件,编写service,activity中绑定service

在项目上点击创建 aidl文件,会自动创建相关目录和文件 app/aidl/jlsky.myaidl/IMaidl.aidl。修改文件如下

package jlsky.myaidl;interface IMaidl {    int sum(int num1,int num2);}ctrl+F9,或者点击那个锤子的图标,生成java代码。如果不是深入研究,生成的java文件就不用关心了。创建service文件。
public class SumService extends Service {    private static final String TAG = "service";

@Override    public IBinder onBind(Intent intent) {        return iBinder;    }

private IMaidl.Stub iBinder = new IMaidl.Stub(){        @Override        public int sum(int num1,int num2) throws RemoteException{            return num1 + num2 ;        }    };

@Override    public void onCreate() {        super.onCreate();        Log.i(TAG, " onCreate");    }    @Override    public boolean onUnbind(Intent intent) {        Log.i(TAG, " onUnbind");        return super.onUnbind(intent);    }    @Override    public void onDestroy() {        Log.i(TAG, " onDestroy");        super.onDestroy();    }}重点是private IMaidl.Stub iBinder = new IMaidl.Stub()中的<IMaidl>要与你的aidl的文件名一致。里面实现的方法就是在aidl中的声明一致。
然后这个<iBinder>在service被绑定时,通过onBind()返回给activity。

在activity中绑定service。比如在activity的onCreate中绑定service
Intent intent = new Intent();intent.setComponent(new ComponentName("jlsky.myaidl","jlsky.myaidl.SumService"));//intent.setAction("jlsky.myaidl.SumService"); //如此写是错误的!boolean b = bindService(intent,conn,BIND_AUTO_CREATE);intent的参数是service的包名和service的全称。b,不是必要的,但可以判断b的值来了解是否绑定成功。事先声明一下
private IMaidl maidl;  //与aidl文件名一致。
conn的来历如下,(直接放在activity中即可。)
private ServiceConnection conn = new ServiceConnection(){//   private class Conn implements ServiceConnection{       @Override       public void onServiceConnected(ComponentName name, IBinder iBinder){           maidl = IMaidl.Stub.asInterface(iBinder);           Log.d(TAG, "onServiceConnected: aidl");       }       @Override       public void onServiceDisconnected(ComponentName name){           maidl=null;           Log.d(TAG, "onServiceDisconnected: aidl");       }   };activity的完整代码如下:
public class MainActivity extends Activity {    private EditText tv1,tv2;    private TextView tv3;    private Button btnSum;    private IMaidl maidl;  //from ServiceConnection    private final static String TAG ="MainActivity";  //  private ServiceConnection conn;

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bindaidl();        Log.d(TAG, "onCreate: bindaidl");        initview();        Log.d(TAG, "onCreate: initview");    }

@Override    protected void onDestroy() {        super.onDestroy();        unbindService(conn);        Log.d(TAG, "onDestroy: unbindService");    }

private void initview() {        tv1=(EditText)findViewById(R.id.tv1);        tv2=(EditText)findViewById(R.id.tv2);        tv3=(TextView)findViewById(R.id.tv3);        btnSum=(Button)findViewById(R.id.btnSum);        btnSum.setOnClickListener(new View.OnClickListener() {

@Override            public void onClick(View view) {                String str1,str2;                str1=tv1.getText().toString();                str2=tv2.getText().toString();                if(str1.length()>0 && str2.length()>0){                    int data1,data2,result;                    try{                        result = maidl.sum(Integer.parseInt(str1),Integer.parseInt(str2));                        Log.d(TAG, "onClick: result"+result);                      //  tv3.setText(""+result);  //int to String                        tv3.setText(String.valueOf(result));//int to String                    } catch (RemoteException e) {                        e.printStackTrace();                    }                }else{                    Toast.makeText(getApplicationContext(),"Pls input",Toast.LENGTH_SHORT).show();                }            }        });    }

private void bindaidl(){        Intent intent = new Intent();        intent.setComponent(new ComponentName("jlsky.myaidl","jlsky.myaidl.SumService"));        //intent.setAction("jlsky.myaidl.SumService"); //it is failed for here !        boolean b = bindService(intent,conn,BIND_AUTO_CREATE);        if(b){            Log.d(TAG, "bindaidl: ok");        }else{            Log.d(TAG, "bindaidl: fault");        }    }

private ServiceConnection conn = new ServiceConnection(){ //   private class Conn implements ServiceConnection{        @Override        public void onServiceConnected(ComponentName name, IBinder iBinder){            maidl = IMaidl.Stub.asInterface(iBinder);            Log.d(TAG, "onServiceConnected: aidl");        }        @Override        public void onServiceDisconnected(ComponentName name){            maidl=null;            Log.d(TAG, "onServiceDisconnected: aidl");        }    };}
manifest中的定义如下
<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="jlsky.myaidl">    <application   ...>        <service            android:name=".SumService"            android:enabled="true"            android:exported="true"            android:process=":sum">            <intent-filter>                <action android:name="jlsky.myaidl"></action>//用来启动服务            </intent-filter>        </service>        <activity android:name=".MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>这个定义是让service单独作为一个进程(不是线程)。省略包名的默认写法。定义为私有线程,这与以点作为分割的公有线程不同。
android:process=":sum"贴出来的代码都是反复实验的结果。有些测试由于记不住了是怎么回事,以免误导,就不写说明了。
时间: 2024-12-26 15:08:19

多进程通讯笔记 android aidl的相关文章

Android AIDL 进行进程间通讯(IPC)

编写AIDL文件时,需要注意: 1.接口名和aidl文件名相同. 2.接口和方法前不用加访问权限修饰符 (public.private.protected等,也不能用final.static). 3.AIDL默认支持的类型包括java基本类型 (int.long.boolean等) 和 (String.List.Map.CharSequence),使用这些类型时不需要import声明.对于List和Map中的元素类型必须是AIDL支持的类型,如果使用自定义类型作为参数或者返回值,自定义类型必须实

android aidl摘要

/*在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的.因此要传递对象, 需要把对象解析成操作系统能够理解的数据格式, 以达到跨界对象访问的目的.在JavaEE中,采用RMI通过序列化传递对象.在Android中, 则采用AIDL(Android Interface Definition Language:接口描述语言)方式实现. AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码

Mina框架的学习笔记——Android客户端的实现

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架.当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发.串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中.目前正在使用 MINA 的软件包括有:Apache Directory Project.Asyn

Android aidl Binder框架浅析

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?Binder可以提供系统中任何程序都可以访问的全局服务.这个功能当然是任何系统都应该提供的,下面我们简单看一下Android的Binder的框架 Android Binder框架分为服务器接口.Binder驱动.以及客户端接口:简单想一下,需要提供一个全局服务,那么全局服务那端即是服务器接口,任何程序即客

[Android学习笔记]Android中多线程开发的一些概念

线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关工作就叫做线程同步. android中,处理线程同步的手段就是:锁 一般分为公平锁和非公平锁: synchronized(内部锁,互斥锁):synchronized是JVM提供的线程同步机制,如果出现问题,JVM能捕获异常,并释放资源,具体实现机制需要查看JVM源码 synchronized的使用特

android AIDL的一些写法

Service这边只要定义一个服务: <service android:name=".BaseTypeService"> <intent-filter > <action android:name="cn.bgxt.Service.BASE_TYPE_SERVICE"/> </intent-filter> </service> 对于传递的是基本类型:创建要传递的数据类型: interface IDog{ S

android学习笔记--android启动过程之init.rc文件浅析

1.  init.rc文件结构文件位置:init.c  : /system/core/initinit.rc  : /system/core/rootdir 首先init.rc文件是以模块为单位的,每个模块里的内容都是一起执行的,模块分为3种类型:on.service.import.我们可以看下init.rc文件是怎么写的:1.import import /init.usb.rc import /init.${ro.hardware}.rc import /init.trace.rc 上面的内容

Android AIDL开发

Introduction   在Android中, 每个应用程序都运行在自己的进程中,拥有独立的内存空间.但是有些时候我们的应用程序需要跟其它的应用程序进行通信,这个时候该怎么办呢?显然, Java中不允许跨进程内存共享.无法直接交换数据.Android中可以采用AIDL的方式实现进程间通信(interprocess communication(IPC)). Android Developer原文介绍如下:AIDL (Android Interface Definition Language)

Android AIDL使用详解

1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述: --1.Create