先说说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);
}
});
}

Aidl的使用步骤的更多相关文章

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

    AIDL是安卓接口定义语言的缩写 由于笔者使用的是android studio所以建立AIDL文件的位置也需要注意,要在APPNAME->main->aidl->packagenam ...

  2. Android 建立AIDL的步骤

    建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下: (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件.该文件的语法类似于Java代码,但会稍有不同.详 ...

  3. AIDL

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

  4. AIDL实例

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5658372.html 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进 ...

  5. Android开发了解——AIDL

    AIDL:Android Interface Definition Language,即Android接口定义语言. 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...

  6. AIDL通信原理

    AIDL (Android Interface Definition Language),通过定义通信接口来实现进程间通信.这是Google提供的一种在安卓应用进程间通信的工具.所以要了解AIDL的通 ...

  7. AIDL Service

    开发AIDL服务的步骤 AIDL(Android Interface Definition Language)是Service的一种重要应用,允许一个应用程序访问另一个应用程序中的对象. 建立AIDL ...

  8. Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

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

    在介绍跨程序进程间通信AIDL前,先看一下本程序activity与某个服务是怎么绑定在一起进行交互的. 需求:服务有两个方法.分别是播放音乐与停止播放音乐.该程序的活动要访问这两个方法,在activi ...

随机推荐

  1. currentStyle

    用js的style属性可以获得html标签的样式,但是不能获取非行间样式. 解决方法: 在IE下可以用currentStyle; 在FF下用getComputedStyle; 然而,为了让其兼容,解决 ...

  2. popupwindow点击空白处如何自动消失?

    Popupwindow如果需要点击空白处自动消失,需要设置两个函数 1.customPopWindow.setFocusable(true);该函数也可以在构造函数中设置,如:mPopupWindow ...

  3. asp.net权限控制配置web.config

    项目下 有三个文件夹 A,B,C 验正方式是 Forms 验正 我要设置他们的访问权限为, A,匿名可访问 B,普通用户授权后才能访问 C,只允许管理员访问 <configuration> ...

  4. AOP静态代理解析1-标签解析

    AOP静态代理使用示例见Spring的LoadTimeWeaver(代码织入) Instrumentation使用示例见java.lang.instrument使用 AOP的静态代理主要是在虚拟机启动 ...

  5. poj2385 dp(递推)

    题目链接 :http://bak3.vjudge.net/contest/136499#problem/D 题意: //转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-1] ...

  6. POJ 2549 二分+HASH

    题目链接:http://poj.org/problem?id=2002 题意:给定一个n个数字组成的序列,然后求出4个数使得a+b+c=d,求d的最大值.其中a,b,c,d要求是给定序列的数,并且不能 ...

  7. [TJOI2016&HEOI2016]

    很有意思.是因为排序那道题才听闻今年tjoi2016的. 题是好题!先把它刷完再去把zhihu look through一遍. bzoj4552 以后看到什么做不出的题,看看能否写二分!!!!写二分! ...

  8. 每天一个linux命令---useradd

    1.添加用户 useradd  选项  用户名 其中各选项含义如下: -c comment 指定一段注释性描述.-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录.-g ...

  9. Prerequisites?[HDU1144]

    Prerequisites?Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...

  10. BZOJ2758 : [SCOI2012]Blinker的噩梦

    首先将包含关系建树. 方法是将每个图形拆成上半边和下半边,从左往右扫描线,用Splay从下到上维护扫描线上所有图形. 每次加入一个新的图形$x$的时候,看看它下方第一个图形$y$,如果$y$是上半边, ...