Aidl的使用步骤

先说说Aidl传递参数类型

1.基本数据类型(除short类型)

2.String、charSequence

3.List,map

4.parcelable

第1步:定义一个*.aidl文件,eclipse会自动生成,android Studio需要编译一下(用Make project)

简单例子:

// IMyService.aidl
package com.example.administrator.yunstore;

// Declare any non-default types here with import statements

interface IMyService {

     void setValue(String name);
     String getValue();

}

(以上是Android studio生成的java文件位置)

第2步:实现AIDL文件生成的JAVA接口Stub

package com.example.administrator.yunstore;

import android.os.RemoteException;

/**
 * Created by Administrator on 2016/7/11.
 */
public class Person extends IMyService.Stub {
    private String name;
    @Override
    public void setValue(String name) throws RemoteException {

        this.name=name;
    }

    @Override
    public String getValue() throws RemoteException {
        return name;
    }
}

  第3步:定义一个自己的service,在实现自己的service时,为了其他应用可以通过bindService来和我们的service进行交互,我们都要实现service中的onBind()方法,并且返回一个继承了Binder的内部类

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

/**
 * Created by Administrator on 2016/7/11.
 */
public class useService extends Service {
    private IMyService.Stub iPerson=new Person();
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("service", "onBind...");
        return iPerson;
    }
}

 第4步,同一个应用中的Activity为该Service中赋值,使用service

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private IMyService iMyService;
    private Button unBindButton,BindButton;

    private ServiceConnection conn=new ServiceConnection() {
        @Override//连接上服务
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {

            iMyService=IMyService.Stub.asInterface(iBinder);
            if(iMyService!=null){
                try {
                    iMyService.setValue("设置值");
                    Toast.makeText(getApplicationContext(),"设定值成功",Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),"设定值失败"+e,Toast.LENGTH_SHORT).show();
                }
            }
        }

        @Override//断开服务
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        unBindButton= (Button) findViewById(R.id.unBind);
        BindButton= (Button) findViewById(R.id.Bind);

        unBindButton.setOnClickListener(new MyButtonListener());
        BindButton.setOnClickListener(new MyButtonListener());

    }
    private class MyButtonListener implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.Bind:{
                    //绑定服务
                    bindService(new Intent("testAIDL"),conn, Service.BIND_AUTO_CREATE);
                    break;
                }
                case R.id.unBind:{
                    //解绑服务
                    unbindService(conn);
                    break;
                }
            }

        }
    }
}

  

客户端:
       第1步:客户端要想使用该服务,肯定要先知道我们的服务在aidl文件中到底对外提供了什么服务,对吧?所以,第一步,我们要做的就是,将aidl文件拷贝一份到客户端的程序中(这里一定要注意,包路径要和服务端的保持一致哦,例如服务端为cn.com.chenzheng_java.remote.a.aidl,那么在客户端这边也应该是这个路径)。

第2步:我们都知道,想要和service交互,我们要通过bindService方法,该方法中有一个ServiceConnection类型的参数。而我们的主要代码便是在该接口的实现中。

第3步:在ServiceConnection实现类的onServiceConnected(ComponentName name, IBinder service)方法中通过类似remoteServiceInterface = RemoteServiceInterface.Stub.asInterface(service);方式就可以获得远程服务端提供的服务的实例,然后我们就可以通过remoteServiceInterface 对象调用接口中提供的方法进行交互了。(这里的关键是通过*.Stub.asInterface(service);方法获取一个aidl接口的实例哦)

我们前面在服务端中说过了,必须提供一个intent-filter来匹配请求是否合法,所以我们在客户端访问服务的时候,还必须传递包含了匹配action的Intent哦。

客户端中使用服务端中的service范例:

private ServiceConnection conn = new ServiceConnection() {
     @Override
     public void onServiceDisconnected(ComponentName arg0) {
     }
     //因为有可能有多个应用同时进行RPC操作,所以同步该方法
     @Override
     public synchronized void onServiceConnected(ComponentName arg0, IBinder binder) {
         //获得IPerson接口
         person = IPerson.Stub.asInterface(binder);
         if(person != null){
             try {
                 //RPC方法调用
                 String name = person.getValue();
                 Toast.makeText(DemoAIDLActivity.this, "远程进程调用成功!值为 : "+name, Toast.LENGTH_LONG).show();
             } catch (RemoteException e) {
                 e.printStackTrace();
                 Toast.makeText(DemoAIDLActivity.this, "远程进程调用失败! ", Toast.LENGTH_LONG).show();
             }
         }
     }
 };    

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
     btn = (Button)findViewById(R.id.btn);
     btn.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View arg0) {
             //该应用中不需要在manifest中配置RemoteService
             bindService(new Intent("forServiceAidl"), conn, Service.BIND_AUTO_CREATE);
         }
     });
 }    

  

时间: 2024-10-17 21:10:26

Aidl的使用步骤的相关文章

Android远程服务(AIDL)实现步骤

AIDL是安卓接口定义语言的缩写 由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagename目录下,否则无法自动生成接口类文件 首先,编写我们的AIDL文件,定义接口方法,语法与JAVA略有不同 其次,我们要在建立的service类中建立实现了该AIDL文件名.stub类的子类,实现继承的方法. 在onbind方法中返回这个子类的一个实例 注册该服务,并给其一个ACTION,此ACTION就是以后

AIDL实例

转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5658372.html 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Lang

AIDL(Android Interface Definition LanguageAndroid接口定义语言)

1.什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口.我们知道4个Android应用程序组件中的3个(Activity.Br

[转]Android 如何建立AIDL

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:       (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件.该文件的语法类似于Java代码,但会稍有不同.详细介绍见实例52的内容.       (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java).       (3)建立一个服务类(Service的子类).       (4)实现由aidl文件生成的Java接口.       (5)在AndroidMa

Android初级教程进程间的通信AIDL

在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activity中控制服务的这两个方法,通过点击按钮的方式实现停止与播放音乐. 对同一个程序服务与活动交互的方式,先给出一张图片: 给出代码(案例为模拟音乐播放器): 一.定义一个服务类MusicService: package com.ydl.music; import android.app.Service

AndroidStudio实现AIDL

AIDL的使用步骤 aidl远程调用传递的参数和返回值支持Java的基本类型(int long booen char byte等)和String,List,Map等.当然也支持一个自定义对象的传递. 服务端 新建一个MyAidlDemoServer工程,然后在main目录下右键新建一个aidl目录,然后在该目录下新建一个IMyAidlInterface.aidl文件,代码如下: 1 interface IMyAidlInterface { 2 3 int add(int arg1, int ar

关于Android中的四大组件(AIDL Service的使用)

跨进程调用Service(AIDL Service) Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 在前一篇文章(关于Android中的四大组件(Service的开启与关闭))中介绍了开发人员如何定制自己的服务,但这些 服务并不能被其它的应用程序访问,为了使其它的应用程序也可以访问本应用程序提供的服务,Android系统采用了 远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其它的基于RPC的解决方案一样,An

Android开发了解——AIDL

AIDL:Android Interface Definition Language,即Android接口定义语言. 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition

[Android] AIDL的使用情况和实例介绍

AIDL是什么? AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现. 什么情况下要使用AIDL 使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的. 如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,