Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx

上传人:b****5 文档编号:17534634 上传时间:2022-12-07 格式:DOCX 页数:21 大小:22.65KB
下载 相关 举报
Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx_第1页
第1页 / 共21页
Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx_第2页
第2页 / 共21页
Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx_第3页
第3页 / 共21页
Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx_第4页
第4页 / 共21页
Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx

《Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx(21页珍藏版)》请在冰豆网上搜索。

Android开发中实现跨进程通讯的AIDL接口Word文档下载推荐.docx

15

16

17

18

19

20

21

22

23

packagecom.cmcc.demo;

importcom.cmcc.demo.ITaskCallback;

interfaceITaskBinder{

booleanisTaskRunning();

voidstopRunningTask();

voidregisterCallback(ITaskCallbackcb);

voidunregisterCallback(ITaskCallbackcb);

}

其中:

ITaskCallback在文件ITaskCallback.aidl中定义:

interfaceITaskCallback{

voidactionPerformed(intactionId);

注意:

理论上,参数可以传递基本数据类型和String,还有就是Bundle的派生类,不过在Eclipse中,目前的ADT不支持Bundle做为参数,据说用Ant编译可以,我没做尝试.

2、Android开发中编译AIDL文件,用Ant的话,可能需要手动,使用Eclipseplugin的话,可以根据adil文件自动生产java文件并编译,不需要人为介入.

3、在Java文件中,实现AIDL中定义的接口.编译器会根据AIDL接口,产生一个JAVA接口。

这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。

接下来就需要自己去实现自定义的几个接口了.

ITaskBinder.aidl中接口的实现,在MyService.java中接口以内嵌类的方式实现:

24

25

26

27

28

29

30

31

32

33

privatefinalITaskBinder.StubmBinder=newITaskBinder.Stub(){

publicvoidstopRunningTask(){

//@TODO

}

publicbooleanisTaskRunning(){

returnfalse;

publicvoidregisterCallback(ITaskCallbackcb){

if(cb!

=null)mCallbacks.register(cb);

publicvoidunregisterCallback(ITaskCallbackcb){

=null)mCallbacks.unregister(cb);

};

在MyActivity.java中ITaskCallback.aidl接口实现:

privateITaskCallbackmCallback=newITaskCallback.Stub(){

publicvoidactionPerformed(intid){

//TODO

printf("

callbackid="

+id);

4、向客户端提供接口ITaskBinder,如果写的是service,扩展该Service并重载onBind()方法来返回一个实现上述接口的类的实例。

这个地方返回的mBinder,就是上面通过内嵌了定义的那个.(MyService.java)

publicIBinderonBind(Intentt){

serviceonbind"

);

returnmBinder;

在Activity中,可以通过Binder定义的接口,来进行远程调用.

5、在服务器端回调客户端的函数.前提是当客户端获取的IBinder接口的时候,要去注册回调函数,只有这样,服务器端才知道该调用那些函数在:

MyService.java中:

voidcallback(intval){

finalintN=mCallbacks.beginBroadcast();

for(inti=0;

i<

N;

i++){

try{

mCallbacks.getBroadcastItem(i).actionPerformed(val);

}catch(RemoteExceptione){

//TheRemoteCallbackListwilltakecareofremoving

//thedeadobjectforus.

mCallbacks.finishBroadcast();

AIDL的创建方法:

AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。

由于远程调用的需要,这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:

1.不需要import声明的简单Java编程语言类型(int,boolean等)

2.String,CharSequence不需要特殊声明3.List,Map和Parcelables类型,这些类型内所包含的数据成员也只能是简单数据类型,String等其他比支持的类型.((另外:

我没尝试Parcelables,在Eclipse+ADT下编译不过,或许以后会有所支持).下面是AIDL语法:

//文件名:

SomeClass.aidl//文件可以有注释,跟java的一样//在package以前的注释,将会被忽略.//函数和变量以前的注释,都会被加入到生产java代码中.packagecom.cmcc.demo;

//import引入语句importcom.cmcc.demo.ITaskCallback;

//函数跟java一样,可以有0到多个参数,可以有一个返回值

//参数可以是另外的一个aidl定义的接口

voidunregisterCallback(ITaskCallbackcb);

//参数可以是String,可以用in表入输入类型,out表示输出类型.

intgetCustomerList(inStringbranch,outString[]customerList);

实现接口时有几个原则:

.抛出的异常不要返回给调用者.跨进程抛异常处理是不可取的..IPC调用是同步的。

如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。

也就是IPC调用会挂起应用程序导致界面失去响应.这种情况应该考虑单起一个线程来处理..不能在AIDL接口中声明静态属性。

IPC的调用步骤:

1.声明一个接口类型的变量,该接口类型在.aidl文件中定义。

2.实现ServiceConnection。

3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递. 

4.在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).调用 

YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。

5.调用接口中定义的方法。

你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。

它只会被远程方法抛出。

6.断开连接,调用接口实例中的ApplicationContext.unbindService()

下面是Android开发中实现AIDL接口的整个程序:

1.ITaskCallback.aidl

2.ITaskBinder.aidl

3. 

MyService.java

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

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

importandroid.app.Service;

importandroid.content.Intent;

importandroid.os.IBinder;

importandroid.os.RemoteCallbackList;

importandroid.os.RemoteException;

importandroid.util.Log;

publicclassMyServiceextendsService{

@Override

publicvoidonCreate(){

servicecreate"

publicvoidonStart(Intentintent,intstartId){

servicestartid="

+startId);

callback(startId);

publicIBinderonBind(Intentt){

publicvoidonDestroy(){

serviceondestroy"

super.onDestroy();

publicbooleanonUnbind(Intentintent){

serviceonunbind"

returnsuper.onUnbind(intent);

publicvoidonRebind(Intentintent){

serviceonrebind"

super.onRebind(intent);

privatevoidprintf(Stringstr){

Log.e("

TAG"

"

###################------"

+str+"

------"

voidcallback(intval){

privatefinalITaskBinder.StubmBinder=newITaskBinder.Stub(){

};

finalRemoteCallbackList<

ITaskCallback>

mCallbacks

=newRemoteCallbackList<

();

4.MyActivity.java

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

importandroid.app.Activity;

importandroid.content.ComponentName;

importandroid.content.Context;

importandroid.content.ServiceConnection;

importandroid.graphics.Color;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.view.ViewGroup;

importandroid.view.View.OnClickListener;

importandroid.widget.AbsoluteLayout;

importandroid.widget.Button;

importandroid.widget.LinearLayout;

importandroid.widget.RelativeLayout;

importandroid.widget.TextView;

importjava.io.BufferedReader;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.FileReader;

import

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 制度规范

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1