AIDL——使用步骤

转载 2016年08月30日 09:36:21

转自http://www.2cto.com/kf/201406/312244.html


1、为什么要有AIDL?

对于AIDL有一些人的浅显概念就是,AIDL可以跨进程访问其他应用程序,和其他应用程序通讯,那我告诉你,很多技术都可以访问,如广播(应用A在AndroidManifest.xml中注册指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看成不同应用之间完成了通讯(但是这种通讯是单向的);还如ContentProvider,通过URI接口暴露数据给其他应用访问;但是这种都算不上是应用之间的通讯。可能最让人迷惑的是Android推出来了Messager,它就是完成应用之间的通讯的。那么为什么还要有AIDL呢,官方文档介绍AIDL中有这么一句话:

Note: Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service. If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger. Regardless, be sure that you understand Bound Services before implementing an AIDL.


第一句最重要,“只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL”,其他情况下你都可以选择其他方法,如使用Messager,也能跨进程通讯。可见AIDL是处理多线程、多客户端并发访问的。而Messager是单线程处理。



2、AIDL使用

第一、定义AIDL文件
// IRemoteService.aidl
package com.example.android;

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

/** Example service interface */
interface IRemoteService {
    /** Request the process ID of this service, to do evil things with it. */
    int getPid();

    /** Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

这段代码也是官方文档的。命名为IRemoteService.aidl,放在com.example.android包下(这个可以随意),保存后Android编译器会在gen目录下自动生成IRemoteService.java文件

第二、定义我们的服务,DDService.java,并且需要在AndroidManifest.xml中注册,并添加“duanqing.test.aidl” 的ACTION
package com.example.service;

import com.example.android.IRemoteService;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.Process;

public class DDService extends Service {
	@Override
	public void onCreate() {
		super.onCreate();
		System.out.println("DDService onCreate........" + "Thread: " + Thread.currentThread().getName());
	}
	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("DDService onBind");
		return mBinder;
	}

	private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
	    public int getPid(){
	    	System.out.println("Thread: " + Thread.currentThread().getName());
	    	System.out.println("DDService getPid ");
	        return Process.myPid();
	    }
	    public void basicTypes(int anInt, long aLong, boolean aBoolean,
	        float aFloat, double aDouble, String aString) {
	    	System.out.println("Thread: " + Thread.currentThread().getName());
	    	System.out.println("basicTypes aDouble: " + aDouble +" anInt: " + anInt+" aBoolean " + aBoolean+" aString " + aString);
	    }
	};

}

这样我们的服务端就完成了,把服务端运行到模拟器(或者手机上),等一会可以看一下打印信息,重点看“线程名”
第三、实现客户端测试代码新建另一个工程,同样需要添加AIDL协议文件(这是一个标准的协议文件,定义对外服务)
package com.example.aidlclient;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Process;
import android.os.RemoteException;
import android.view.View;

import com.example.android.IRemoteService;

public class MainActivity extends Activity {
	private IRemoteService remoteService;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    ServiceConnection conn = new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			remoteService =	IRemoteService.Stub.asInterface(service);
			try {
				int pid = remoteService.getPid();
				int currentPid = Process.myPid();
				System.out.println("currentPID: " + currentPid +"  remotePID: " + pid);
				remoteService.basicTypes(12, 1223, true, 12.2f, 12.3, "我们的爱,我明白");
			} catch (RemoteException e) {
				e.printStackTrace();
			}
			System.out.println("bind success! " + remoteService.toString());
		}
	};
		
    /**
     * 监听按钮点击
     * @param view
     */
    public void buttonClick(View view) {
    	System.out.println("begin bindService");
    	Intent intent = new Intent("duanqing.test.aidl");
    	bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

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



Android AIDL使用步骤

最近项目中用到蓝牙打电话,需要调用AIDL实现,说实话,AIDL之前没有用过,其实不太会,于是网上搜索哈,算是知道怎么用了,具体实现原理还是不太懂,反正知道怎么用了。原理:就是A程序定义一个AIDL文...
  • u011747761
  • u011747761
  • 2015年08月13日 11:08
  • 2412

AIDL使用方法总结

一、AIDL使用步骤(Android studio环境)场景:应用B要调用应用A中的方法。应用A中要做的事情:(1)src下 右键创建一个aidl文件,提供一个打印日志的方法,编码方式类似java,如...
  • u013347784
  • u013347784
  • 2016年06月07日 15:20
  • 465

AIDL的使用情况和实例介绍

AIDL是什么?什么情况下要使用AIDL,定义一个AIDL接口的步骤,用一个实例来分步骤说明...
  • Amazing7
  • Amazing7
  • 2016年05月04日 18:47
  • 14437

AIDL的理解与使用详解

本篇文章将对Android中的AIDL服务的概念和创建AIDL服务的步骤进行介绍,结合简单的代码示例,力求更易理解。 AIDL:Android Interface Definition Langua...
  • ft_sunshine
  • ft_sunshine
  • 2017年01月16日 17:17
  • 723

Android AIDL的理解和使用

注:内容部分来自于极客学院 服务端程序使用Intent显示的启动另一个App的Service 1.在服务端程序要有一个Servicepublic class AppService extend...
  • qq_23589445
  • qq_23589445
  • 2015年12月23日 13:00
  • 1713

Android Studio中使用AIDL简单示例

这两天在学习aidl跨进程调用,研究了一天终于写出了个helloword。。做下记录吧。 根据官方提供的指南,开发aidl跨进程调用,主要分以下步骤: 1.创建.aidl文件-该文件(YourIn...
  • lingwu7
  • lingwu7
  • 2015年11月30日 23:12
  • 1827

Android 中AIDL的使用与理解

AIDL的使用:最常见的aidl的使用就是Service的跨进程通信了,那么我们就写一个Activity和Service的跨进程通信吧。 首先,我们就在AS里面新建一个aidl文件(ps:现在AS建...
  • u011974987
  • u011974987
  • 2016年04月25日 16:58
  • 21253

Android 进阶7:进程通信之 AIDL 的使用

记得 2015 年实习面试,笔试题里就有这道题:请介绍下 AIDL。当时的我是懵逼的,只好老老实实空着。没想到后来面试时面试官大哥嘿嘿一笑说他也没用过这玩意,真是够实诚的。笔试完查了这个知识点,似懂非...
  • u011240877
  • u011240877
  • 2017年05月26日 11:43
  • 4023

为什么要用AIDL

说到AIDL,每次就配套一个单词就是IPC,到底是怎么一回事,这事得从多进程说起。 有一天,我们写了一个类,类里面有一个静态变量。就像下面这样public class UserBean { ...
  • f112122
  • f112122
  • 2015年12月09日 22:33
  • 1150

Android中AIDL的基本用法

转载自:http://flrito.cc/notes-androidzhong-aidlde-ji-ben-yong-fa/ 早些时候就听说过AIDL,也常在各种Android面试题、教程甚至大...
  • fwt336
  • fwt336
  • 2016年09月19日 16:57
  • 6352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AIDL——使用步骤
举报原因:
原因补充:

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