第一、定义AIDL文件
这段代码也是官方文档的。命名为IRemoteService.aidl,放在com.example.android包下(这个可以随意),保存后Android编译器会在gen目录下自动生成IRemoteService.java文件 第二、定义我们的服务,DDService.java,并且需要在AndroidManifest.xml中注册,并添加“duanqing.test.aidl” 的ACTION
这样我们的服务端就完成了,把服务端运行到模拟器(或者手机上),等一会可以看一下打印信息,重点看“线程名”
第三、实现客户端测试代码 新建另一个工程,同样需要添加AIDL协议文件(这是一个标准的协议文件,定义对外服务),这里我列出来我的测试代码:
4、执行 点击客户端按钮,执行,看打印信息:
看服务端打印,DDService onCreate..........Thread: main,主线程,当客户端调用服务端getPid方法时,服务端是在Thread: Binder2中执行,当客户端调用服务端basicType方法时,服务端是在Thread:Binder1中执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 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);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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协议文件(这是一个标准的协议文件,定义对外服务),这里我列出来我的测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
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);
}
}
|

看服务端打印,DDService onCreate..........Thread: main,主线程,当客户端调用服务端getPid方法时,服务端是在Thread: Binder2中执行,当客户端调用服务端basicType方法时,服务端是在Thread:Binder1中执行