Android用AIDL创建Service

原创 2016年06月16日 15:28:05

官网任玉刚大神

接下来是我的实践

Server服务端创建

定义一个简单aidl接口

在工程上右键新建AIDL文件,填写文件名,比如我的就是IMyAidlInterface,里面有一个自动生成的函数是展示一些你可以在AIDL中使用的一些类型值。添加一个add函数如下。
  AIDL接口

接下来Rebuild工程,你就会发现app/build/gnerated/source/aidl/下会有系统为你创建的对应接口的java接口文件。它继承自IInterface,含有我们创建的add方法。并含有一个实现了IMyAidlInterface的静态内部类stub.如下。

关于stub的一些介绍:
asInterface:将一个IBinder对象转换成IMyAidlInterface接口。如果在同一进程则返回的是本地Binder,否则返回的是Binder代理对象。如果对Binder有疑惑可以看下此篇文章http://weishu.me/2016/01/12/binder-index-for-newer/

onTransact : 会发现刚才创建的add函数自带的basicType函数均在里面。进行数据的序列化传输,传给Binder驱动,驱动完成后在序列化读取。

Proxy:当service和client位于不同的进程时,调用asInterface返回的就是此代理对象。
    sdk生成接口java文件
IMyAidlInterface.java代码就不贴了

创建Service

创建自己的service继承自Service你可以手动创建也可以直接在工程右键创建.记得配置AndroidManifest.

注意:你需要在OnBind()函数里返回一个IMyAidlInterface.Stub对象的子类,即首先你需要创建自己的Stub子类并实现add方法,如下我只是简单相加。返回的子类将在ServiceConnection对象中获得下面会讲到。

public class MyAidlService extends Service {
    private MyAidlBinder myAidlBinder;

    public class MyAidlBinder extends IMyAidlInterface.Stub{
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }

        @Override
        public int add(int a, int b) throws RemoteException {
            return a+b;
        }
    }

    public MyAidlService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        myAidlBinder = new MyAidlBinder();
    }

    //onBind返回的IBinder对象要是IMyAidlService.Stub的子类的实例
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return  myAidlBinder;
    }
}

创建Acticity

让服务端可以启动。简单配置显示”Serve”(添加一个TextView即可).

Client客户端创建

添加AIDL

首先将服务端的Aidl文件服务过来,注意Aidl文件包名必须相同,如下所示。
客户端田间AIDL文件

创建Activity

  1. 创建ServiceConnection对象实现onServiceConnected方法获取OnBind方法传递过来的Service,并调用IMyAidlInterface.Stub.asInterface(service)方法转换为IMyAidlInterface接口。
  2. 调用add方法获取值,并展示。
public class MainActivity extends AppCompatActivity {
    public static String TAG="MainActivity:";
    private IMyAidlInterface myAidlServive;

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myAidlServive = IMyAidlInterface.Stub.asInterface(service);
            if(myAidlServive ==null) System.out.println(TAG+"myAidlServive==null");
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myAidlServive = null;
        }
    };

    //wight
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button)findViewById(R.id.bt);
        textView = (TextView)findViewById(R.id.tv);

        //创建所需要绑定的Service的Intent
        Intent intent = new Intent();
        intent.setAction("com.example.chenfeng.binderstudy.AIDL_SERVICE");
        intent.setPackage("com.example.chenfeng.binderstudy");
        //绑定远程服务
        bindService(intent,connection, Service.BIND_AUTO_CREATE);

        //点击进行Binder通信,获取值
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    button.setText(String.valueOf(myAidlServive.add(5,3)));
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.unbindService(connection);
    }
}

效果图:
效果图
附件:源代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

AIDL中遇到的问题,记录一下 + 避免绑定启动service 后 activity 与service 之间参数为null的情况

1.通过bindService连接-->oncreate-->onBind-->onServiceConnected 2.da
  • zdy10326621
  • zdy10326621
  • 2014年07月25日 18:09
  • 915

AIDL:远程调用服务里的方法失败,提示取得的IBinder对象NullPointerException

问题: AIDL:远程调用服务里的方法失败,提示取得的IBinder对象NullPointerException 解决办法: 不要忘记了在Service中的onBind()方法中返回IBin...
  • computer30000
  • computer30000
  • 2015年06月25日 21:31
  • 739

android开发AIDL实例

由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另一个进程的内存空间。但是android提...
  • wangkuifeng0118
  • wangkuifeng0118
  • 2012年02月20日 23:29
  • 11904

Android:学习AIDL,这一篇文章就够了(上)

前言在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了。不过又转念一想,我...
  • luoyanglizi
  • luoyanglizi
  • 2016年07月21日 10:58
  • 70559

Android Studio开发基础之Service

1、Service的使用        Activity可以呈现一个用户界面,但是Service确实运行在后台,新建一个Myservice.java,会在AndroidManifest中自动配置标签。...
  • lucky51222
  • lucky51222
  • 2015年05月23日 10:24
  • 8734

Android Studio下使用AIDL创建和使用远程service

好久没来更新博客了,今天心血来潮来写一篇关于如何在AS下结合AIDL创建和使用远程service。在此之前我先跟大家解释下什么是远程service?以及为什么要使用远程service?相信不管对于安卓...
  • u010214991
  • u010214991
  • 2016年07月05日 18:34
  • 1604

AndroidStudio通过AIDL开启、绑定远程Service

本文以一个简单的案例,记录一下怎么使用AIDL结合Serice实现进程间的通信,让其他程序可以调用服务中的方法...
  • man_help
  • man_help
  • 2016年04月17日 15:25
  • 3525

android studio使用Aidl跨进程调用服务

以前就知道其大概代码流程,但是一直没有敲代码去实现,今天将其实现了,android studio下编写也遇到了一些小细节的问题,特此记录一下。 既然是模拟Aidl通讯,那么当然要编写两个应用了,一个...
  • lishaobo211985
  • lishaobo211985
  • 2016年10月20日 22:02
  • 1251

Android Studio中创建AIDL Service

用startService,bindService创建的服务只能在本应用程序内访问,如果要使得本程序的服务能够被其他应用程序访问,这时候就要使用远程过程调用(Remote Procedure Call...
  • shenzhonglaoxu
  • shenzhonglaoxu
  • 2015年01月15日 12:49
  • 13638

Android-在Android studio中实现远程服务(Service)AIDL

在Android studio 实现远程服务(Service)AIDL的方法与在eclipse中实现有些不同,Android studio中自带了AIDL创建的方式,而eclipse中需要手动创建; ...
  • u014657752
  • u014657752
  • 2015年08月27日 16:17
  • 1561
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android用AIDL创建Service
举报原因:
原因补充:

(最多只允许输入30个字)