- 浏览: 206359 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xumin_minzi:
我也在使用ndk编译,ffmpeg源码放在哪个目录里面?
[原创]Android ndkr8编译 FFmpeg 0.11.1 "Happiness" -
ericchan2012:
在Dialog调用show方法之后
【原创】Android 设置Dialog的长宽和位置 -
maohualei:
求解: 我设置的时候 位置居然没有反应 dial ...
【原创】Android 设置Dialog的长宽和位置
Aidl,android平台的IPC方式之一,基于系统的Ibinder机制。
网上大多数例子都是在一个apk下来测试调用service,现在我在两个project下面来调用。
一个是server project,一个是client project
首先我们建立的是server project,这里面要实现aidl文件和一个service,activity只是用来启动service的,当然,你也可以通过发广播的形式来启动service。
首先看IAidlService.aidl文件:
这样在eclipse里面自动编译的时候会在gen下面生成IAidlService.java文件(灯下我们的client project要用)。
然后新建一个service,这个service里面has a IAidlService的stub对象,service具体代码如下:
这里一定要实现onBind方法,并返回一个IAidlService.Stub对象。
再去AndroidManifest.xml注册这个service:
android:enabled="true"
android:process=":remote"这两个标签可有可无。
只要注册了这个service就行。
好了,到此,服务端已经完成。
-------------------华丽的分割线-----------------------------------------
下面我们开始client project。
client project比较简单,需要注意的地方是,首先需要把server project中gen文件夹中aidl生成的那个IAidlService.java类以及包都拷贝到我们的client project中。
(注意:client project的包名为com.ds.client;另外一个包名com.ds.server以及这个server包下面的IAidlService.java类都是从server project的gen文件夹拷贝过来的,至于gen文件夹的其他文件就不需要拷贝过来。)。
好了,这样的话,client project只要从activity去远程调用service就好了,实现代码如下:
注意几点:
1,import com.ds.server.IAidlService;使用的是我们拷贝过来的IAidlService.java类
2,需要一个ServiceConnection对象
3,通过Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);来bind service。这样就可以调用aidl中定义的接口来获取service中的值了。
唉,由于在使用中没有注意拷贝server project中gen文件夹下面的包和IAidlService.java,老是出现Unable to start service Intent这样的错误。搞了好久。
附件是源码。注意使用的时候,先要运行server project,启动服务,然后再运行client project。
参考资料:http://www.cnblogs.com/TerryBlog/archive/2010/08/24/1807605.html
网上大多数例子都是在一个apk下来测试调用service,现在我在两个project下面来调用。
一个是server project,一个是client project
首先我们建立的是server project,这里面要实现aidl文件和一个service,activity只是用来启动service的,当然,你也可以通过发广播的形式来启动service。
首先看IAidlService.aidl文件:
package com.ds.server; interface IAidlService { int getType(); }
这样在eclipse里面自动编译的时候会在gen下面生成IAidlService.java文件(灯下我们的client project要用)。
然后新建一个service,这个service里面has a IAidlService的stub对象,service具体代码如下:
package com.ds.server; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; public class AidlService extends Service { private IAidlService.Stub mBinder = new IAidlService.Stub() { @Override public int getType() throws RemoteException { // TODO Auto-generated method stub return 5; } }; private void Log(String str) { Log.d("AidlService", "------ " + str + "------"); } @Override public void onCreate() { Log("service create"); } @Override public void onStart(Intent intent, int startId) { Log("service start id=" + startId); } @Override public IBinder onBind(Intent t) { Log("service on bind"); return mBinder; } @Override public void onDestroy() { Log("service on destroy"); super.onDestroy(); } @Override public boolean onUnbind(Intent intent) { Log("service on unbind"); return super.onUnbind(intent); } public void onRebind(Intent intent) { Log("service on rebind"); super.onRebind(intent); } }
这里一定要实现onBind方法,并返回一个IAidlService.Stub对象。
再去AndroidManifest.xml注册这个service:
<service android:name=".AidlService" android:enabled="true" android:process=":remote" > <intent-filter> <action android:name="com.ds.server.IAidlService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
android:enabled="true"
android:process=":remote"这两个标签可有可无。
只要注册了这个service就行。
好了,到此,服务端已经完成。
-------------------华丽的分割线-----------------------------------------
下面我们开始client project。
client project比较简单,需要注意的地方是,首先需要把server project中gen文件夹中aidl生成的那个IAidlService.java类以及包都拷贝到我们的client project中。
(注意:client project的包名为com.ds.client;另外一个包名com.ds.server以及这个server包下面的IAidlService.java类都是从server project的gen文件夹拷贝过来的,至于gen文件夹的其他文件就不需要拷贝过来。)。
好了,这样的话,client project只要从activity去远程调用service就好了,实现代码如下:
package com.ds.client; import com.ds.server.IAidlService; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class AidlClientActivity extends Activity { IAidlService iservice; private ServiceConnection connection = new ServiceConnection() { public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub // 从远程service中获得AIDL实例化对象 iservice = IAidlService.Stub.asInterface(service); Log.i("Client","Bind Success:" + iservice); } public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub iservice = null; Log.i("Client","onServiceDisconnected"); } }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final TextView tv = (TextView) findViewById(R.id.tv); Button bt = (Button) findViewById(R.id.bt); bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent service = new Intent(IAidlService.class.getName()); bindService(service, connection, BIND_AUTO_CREATE); if (iservice != null) { try { tv.setText("" + iservice.getType()); } catch (RemoteException e) { e.printStackTrace(); } } } }); } }
注意几点:
1,import com.ds.server.IAidlService;使用的是我们拷贝过来的IAidlService.java类
2,需要一个ServiceConnection对象
3,通过Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);来bind service。这样就可以调用aidl中定义的接口来获取service中的值了。
唉,由于在使用中没有注意拷贝server project中gen文件夹下面的包和IAidlService.java,老是出现Unable to start service Intent这样的错误。搞了好久。
附件是源码。注意使用的时候,先要运行server project,启动服务,然后再运行client project。
参考资料:http://www.cnblogs.com/TerryBlog/archive/2010/08/24/1807605.html
- AidlClient.tar.gz (139.3 KB)
- 下载次数: 77
- AidlServer.tar.gz (140.1 KB)
- 下载次数: 71
发表评论
-
拖拽滑动_有3D_有循环
2012-12-11 17:38 1140android桌面拖拽3d效果 -
三星通讯录滑动出发开关
2012-12-11 17:37 905下面的代码是仿三星9300中的滑动打电话和发短信的。 -
三星通讯录滑动触发开关以及StatusBar下拉快捷键的效果
2012-10-20 17:26 13881,三星通讯录滑动触发开关 你可以参考: http://gja ... -
android水波纹效果之一
2012-09-17 22:27 1189参考: http://www.apkbus.com/archi ... -
为launcher添加一个仿Mac的dock(附源码)
2012-09-17 21:50 955之前在网上看到有篇文章:Launcher之Dock细节篇htt ... -
android桌面预览效果
2012-09-17 21:49 977主要改动的是:workspace.Java和launcher. ... -
Android 自定义滚动视图
2012-08-24 22:39 577MainActivity package org. ... -
实现通讯录的弹窗效果
2012-08-19 22:06 1776参考http://www.cnblogs.com/noTice ... -
【原创】android ViewPager控件的使用
2012-06-15 10:33 2393android4.0有个控件,就是viewpager,用来实现 ... -
【原创】android 实现气泡式listview
2012-06-14 13:33 1975iphone中短信聊天都是那种气泡式的,当然,android短 ... -
【原创】android中实现底部tabhost
2012-06-14 10:14 1753这个主要是实现底部的tabhost方式,tabhost就是有几 ... -
【原创】android中定义BaseActivity
2012-06-13 12:53 5648[size=medium] 需求: 如果一个应用程序中有许多a ... -
【原创】android进入应用程序时的动画实现
2012-06-12 11:34 1454相信玩过android应用的同学都看过进入应用程序时出现的短暂 ... -
【原创】android仿ucweb的菜单效果
2012-06-12 11:12 1157[size=medium]先看一张图 这里有几个要点 1,主 ... -
【原创】android2.3如何加入对wml的支持
2012-06-12 09:52 1313其实就是改makefile文件: 1,开启宏定义: 在exte ... -
【原创】dip与px
2012-06-11 10:38 876真正要做适配的,只有是当图片被拉抻后,是否变形了,如果变形了, ... -
【转】Android-Action Bar使用方法
2012-06-06 14:49 1828转自http://disanji.net/2011/02/24 ... -
【原创】Android仿新浪微博的“更多”页面效果
2012-05-29 17:38 2240看到新浪微博那个“更多”页面的效果,感觉不错,所以拿来模仿一下 ... -
【原创】Android 设置Dialog的长宽和位置
2012-05-28 10:11 2722在Dialog调用show方法之后,加上以下代码: Wi ... -
【原创】Android 实现微博分享功能
2012-05-27 22:20 1470通过发送下面的intent: Intent intent = ...
相关推荐
本话题将深入探讨如何利用AIDL实现三个APK之间的通信,特别是当B作为主程序,A远程调用B并为C提供接口以调用B的功能。 首先,我们需要理解AIDL的基本概念。AIDL本质上是一种接口定义语言,它允许开发者定义在两个...
AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,交换数据,即使它们运行在不同的进程中。在“Aidldemo”中,我们可以看到一个服务端(AIDLServer)和客户端(AIDLClient)的示例,这是...
综上所述,"两个APK间AIDL通信"是Android开发中一种重要的进程间通信方式,它依赖于AIDL、Binder机制以及Service和Activity的协作。理解并熟练掌握这一技术,对于开发复杂的Android应用具有重要意义。
本示例"android aidl demo"提供了两个APK,分别展示了服务(Services)和活动(Activities)如何通过AIDL进行交互。 首先,我们来理解AIDL的基本概念。AIDL类似于Java接口,但它的设计目标是处理跨进程通信。当你...
Android 之 AIDL 和远程 Service 调用 Android 相对布局技巧 android开发环境之Logcat(日志)教程实例汇总 android网络通信之socket教程实例汇总 AsyncTask进度条加载网站数据到ListView 命令行开发、编译、打包...
本示例"BinderDemo"通过"AIDL"(Android Interface Definition Language)展示了如何在`ipc_server`和`ipc_client`两个APK之间实现Binder通信,以基础的加法和减法运算为例。 首先,我们需要理解AIDL的基本概念。...
下面我们将详细探讨这两个工具以及其他可能包含在SDK Tools中的组件。 1. **TraceView**: TraceView是Android SDK中的一个图形化视图,用于分析Java代码的执行性能。它能够显示应用程序中每个方法的调用时间,帮助...
通过这两个核心组件,ApkPlug实现了插件与主应用的无缝集成。 1. **ApkPlug的安装与配置** 在使用ApkPlug之前,你需要将其库文件添加到你的项目中。这通常通过在Gradle构建脚本中引入依赖来完成。添加依赖后,按照...
14.5.6 从两个位置控制唤醒锁 14.5.7 长期运行的服务的实现 14.5.8 测试长期运行的服务 14.6 代码编译说明 14.6.1 从ZIP文件创建项目 14.6.2 通过代码清单创建项目 14.7 参考资料 14.8 小结 ...
Android支持多种IPC机制,包括AIDL、Binder、Socket等,用于实现不同进程间的数据交换和功能调用。 ### 61. 如何理解MVC模式及其在Android中的应用? MVC(Model-View-Controller)是一种软件架构模式,用于分离...
- 使用AIDL(Android Interface Definition Language)定义接口,实现不同进程间的通信。 - 使用`Messenger`和`Binder`机制实现进程间的数据交换。 #### 15. 子线程更新主线程控件可能出现的异常 - **异常**:`...
14.5.6 从两个位置控制唤醒锁 14.5.7 长期运行的服务的实现 14.5.8 测试长期运行的服务 14.6 代码编译说明 14.6.1 从ZIP文件创建项目 14.6.2 通过代码清单创建项目 14.7 参考资料 14.8 小结 ...