- 浏览: 514607 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
在android中有一个程序员大量使用的操作,就是bindservice,通过一个service可以实现代码的复用以及解耦,所以对这个bindservice的理解的深度直接影响了一个开发人员对于android系统开发的整体的掌握情况。vRD平坦软件园
vRD平坦软件园
好啦,废话不多说,首先我们来看一个我开发过程中遇到的例子。vRD平坦软件园
vRD平坦软件园
在开发中我们常常要用到这们一种情况,我们的UI逻辑和为UI逻辑提供服务的一些算法的是需要解耦的。这样,当我们UI和算法各自独立发生变化的时候,只
要接口没有改变,对于UI的开发人员和算法的开发人员来将,就可以不去考虑,这个对与开发的好处,我想不用多说了。vRD平坦软件园
vRD平坦软件园
Android的Service是基于IBinder的, IBinder其实就是windows上的com,这个以后我会有详细的文章来解释。vRD平坦软件园
vRD平坦软件园
要使用service首先要通过AndroidMainifest.xml注册,这样在安装你的包的时候,系统就会识别出你所编写的serice,这样就可以提供给别的应用使用了。vRD平坦软件园
vRD平坦软件园
一个典型service的AndroidMainifest.xml如下:vRD平坦软件园
vRD平坦软件园
<service android:name="your_service_name"vRD平坦软件园
android:exported="true"vRD平坦软件园
android:process="your_service_process_name">vRD平坦软件园
<intent-filter>vRD平坦软件园
<action android:name="intent_string_to_start_your_service" />vRD平坦软件园
<category android:name="android.intent.category.DEFAULT" />vRD平坦软件园
</intent-filter>vRD平坦软件园
</service>vRD平坦软件园
vRD平坦软件园
这个service域要放在xml文件的application域中,其中android:name的意思是你的service的名字,可以是你想要的任
意的字符串。android:process是当这个service被你的调用启动起来以后在系统中进程的名字。如果这个域没有写,那么默认的启动的是
local的service,就是将service放到本地进程的主线程中,如何你之定了一个进程的名字,那么系统就会启动一个独立的进程作为你的服务,
在shell中,通过ps就可以看到这个进程的名字。action android:name的意思是说那个Intent会启动这个service。vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
在添加了xml文件以后,就是正式的开写java的代码了。vRD平坦软件园
vRD平坦软件园
首先,要创建一个aidl文件,熟悉windows上com的同志,看到这个名字都会会心的一笑,因为这个和windows上的midl是一样的,估计就
是一帮搞windows的人被google挖走了。android和根据这个aidl自动的声称一个infterface的文件做为service的接口
文件。vRD平坦软件园
vRD平坦软件园
这里我提供一个例子:vRD平坦软件园
vRD平坦软件园
package com.motorola.inputmethod.base;vRD平坦软件园
vRD平坦软件园
interface IYourAidl {vRD平坦软件园
int A(int i, in int[] j, out int[] k );vRD平坦软件园
int B(int i, in int[] j, out int[] k );vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
在这里我们要注意的是你所定义的接口的变量的类型,android为一个他所默认的类型提供了相应的parcel服务类。如果你的参数的类型是一些
java的基本类型,或是string,
arrayd等,是没有问题的,当如果参数是你自己定义的class类型,那么你就要写一个自己的parcel类了,这个以后我们还会说。还有就是,大家
看如果A中的参数是int这些简单的类型的,那么没问题,如果是像int[]这样的类型的话,那么你要在类型的情面加上in 或是
out来告诉系统这个是一个输入还是输出参数。vRD平坦软件园
vRD平坦软件园
在写完aidl文件以后我们在添加一个对应与aidl文件的Android.mk文件。如下:vRD平坦软件园
vRD平坦软件园
LOCAL_PATH:= $(call my-dir)vRD平坦软件园
include $(CLEAR_VARS)vRD平坦软件园
vRD平坦软件园
LOCAL_SRC_FILES := /vRD平坦软件园
path_to_your_aidl_file/your_test.aidlvRD平坦软件园
vRD平坦软件园
LOCAL_MODULE := com.android.youraidlvRD平坦软件园
vRD平坦软件园
include $(BUILD_STATIC_JAVA_LIBRARY)vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
OK,
在搞定aidl以后,我们开始实现一个使用这个aidl的service,其实一个service可以还有任何一个对象,不一定要含有aidl的,这里我
们只是使用了aidl作为service的一个对象,其实service是service,aidl是aidl,这个希望大家能够理解。vRD平坦软件园
vRD平坦软件园
一个service如下:vRD平坦软件园
vRD平坦软件园
import android.app.Service;vRD平坦软件园
vRD平坦软件园
import path_to_your_aidl_file.IYourAidl;vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
public class your_service_name extends Service {vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
public void onCreate() {vRD平坦软件园
super.onCreate();vRD平坦软件园
vRD平坦软件园
log.d("service onCreate")vRD平坦软件园
vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
public void onDestroy() {vRD平坦软件园
vRD平坦软件园
super.onDestroy();vRD平坦软件园
vRD平坦软件园
log.d("service onDestroy")vRD平坦软件园
vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
private final IYourAidl.Stub mBinder = new IYourAidl.Stub(){vRD平坦软件园
vRD平坦软件园
public int A(int i, in int[] j, out int[] k ){vRD平坦软件园
vRD平坦软件园
log.d("aidl implimention do something in A");vRD平坦软件园
vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
public int B(int i, in int[] j, out int[] k ){vRD平坦软件园
vRD平坦软件园
log.d("aidl implimention do something in B");vRD平坦软件园
vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
public IBinder onBind(Intent intent) {vRD平坦软件园
return mBinder;vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
在你实现的service中,首先要保证你的service的名字和AndroidMainifest.xml中的android:name的名字是一样
的。然后,在你的service中要实现onCreate和onDestroy两个接口,onBind操作返回的是一个IBinder的子类,在这里我们
返回的是aidl的一个实现。在你启动一个service的时候,service首先调用onCreate然后调用onBind返回service本地的
一个对象。vRD平坦软件园
vRD平坦软件园
在service中,引为aidl是一个抽象类,所以我们要提供一分基于该接口的实现。vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
好了,现在service这边就准备好了,当你的service被安装到系统以后,一个客户端就可启动他了。 启动代码如下:vRD平坦软件园
vRD平坦软件园
import android.content.ServiceConnection;vRD平坦软件园
vRD平坦软件园
import path_to_your_aidl_file.IYourAidl;vRD平坦软件园
vRD平坦软件园
import your_service_name;vRD平坦软件园
.............vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
private IYourAidl mAidl;vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
private class YourServiceConnection implements ServiceConnection {vRD平坦软件园
vRD平坦软件园
public void onServiceConnected(ComponentName name, IBinder service) {vRD平坦软件园
mAidl = IYourAidl.Stub.asInterface(service);vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
public void onServiceDisconnected(ComponentName name) {}vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
private YourServiceConnection mServiceConnection;vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
public boolean startService(){vRD平坦软件园
if (null == mAidl) {vRD平坦软件园
Intent serviceIntent = new Intent("intent_string_to_start_your_service");vRD平坦软件园
vRD平坦软件园
if (null == mServiceConnection) {vRD平坦软件园
mServiceConnection =vRD平坦软件园
new YourServiceConnection();vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
// Bind servicevRD平坦软件园
if (bindService(serviceIntent, mServiceConnection, Context.BIND_AUTO_CREATE)) {vRD平坦软件园
return true;vRD平坦软件园
} else {vRD平坦软件园
return false;vRD平坦软件园
}vRD平坦软件园
}vRD平坦软件园
return true;vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
当客户端调用startService的时候,最忠会调用bindService,
他的第一个参数是一个intent就是和xml文件相同的Intent名字的一个intent。第二个参数是一个ServiceConnection对
象,作为回调函数, Context.BIND_AUTO_CREATE表示的是自动绑定。vRD平坦软件园
vRD平坦软件园
在用户调用bindservice以后,系统会检查是否有符合Intent的service,如果有的话就创建了,如果没有的话,就创建一个新的
service,并调用service的onCreate接口。同时如果制定了ServiceConnection对象和
BIND_AUTO_CREATE参数,那么就会调用service的onBind接口,onBind接口返回的IBinder对象传个
ServiceConnection的onServiceConnected的第二个参数,在onServiceConnected中通过mAidl =
IYourAidl.Stub.asInterface(service);将远程的一个变量和本地的一个变量绑定。从而实现了RPC调用,这样,用户进
程就是可以像使用本地变量一样通过PRC调用远程的操作了。BindService操作是一个异步的操作,所以什么时候能调用
onServiceConnected是不一定的,如果在用户进程中bindservice以后直接使用mAidl而没有判断的话,很可能会有错误。vRD平坦软件园
vRD平坦软件园
同时如果通过mAidl调用远程操作的话,需要将操作包含在 vRD平坦软件园
vRD平坦软件园
try{vRD平坦软件园
mAidl.A(.....)vRD平坦软件园
}vRD平坦软件园
catch(RemoteException e) {vRD平坦软件园
Log.e("error", e.getMessage());vRD平坦软件园
}vRD平坦软件园
vRD平坦软件园
中vRD平坦软件园
vRD平坦软件园
vRD平坦软件园
以上是我对service使用的一个例子,其实在Service背后支持着他的是IBinder的IPC机制,这个我会专门用文章来讲。
发表评论
-
onInterceptTouchEvent和onTouchEvent调用时序
2012-02-08 08:44 1053onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 919Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1218Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1574【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1153Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1207android 中使用socket使native和frame ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1297Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 904近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1078AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 10411. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 860(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2174Android的Launcher成为系统 ... -
Launcher的启动过程
2011-05-12 19:36 22461. Launcher的启动过程 从网络上 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6564android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2892典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1171转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2485android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 35241.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1486在生成的apk目录下放 signapk.jar platfo ... -
binder理解
2011-03-30 10:37 2235Binder理解 例子代码: /** {@hide} ...
相关推荐
在Android平台上,WPS Office是一款广泛使用的办公软件,支持创建、编辑和查看各种文档。而AIDL(Android Interface Definition Language...理解并熟练掌握AIDL调用,对于开发高效、稳定的Android第三方应用至关重要。
在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。Android Aidl(Android Interface Definition ...理解和掌握Aidl对于开发复杂的Android应用至关重要。
理解Binder框架和aidl的使用,对于开发Android系统级服务或需要跨进程通信的应用至关重要。通过aidl,我们可以方便地定义接口,实现进程间的交互,使得Android应用能够灵活地扩展其功能,与其他应用或系统组件协同...
本示例"android AidlDemo(简单aidl的例子)"将带领我们深入理解如何在Android应用中使用AIDL。 1. **AIDL的基本概念** - AIDL是一种接口定义语言,它的主要作用是让不同的Android进程能够安全、高效地进行通信。 -...
首先,我们需要理解AIDL的基本概念。AIDL是一种声明式语言,它允许开发者定义接口,这些接口可以被不同的Android进程调用。当一个应用组件(如Activity)需要与另一个组件进行通信时,如果它们不在同一个进程中,就...
这个"android AIDL 完整DEMO"应该包含了一个完整的示例,帮助开发者理解并实践AIDL的使用。 首先,让我们深入了解一下AIDL的基本概念。AIDL类似于Java接口,但它的设计目的是跨越进程边界,允许一个应用组件(如...
在Android系统中,AIDL(Android Interface Definition Language)是一种接口定义语言,用于实现不同进程间的通信,即远程进程通讯。AIDL使得服务(Service)和活动(Activity)这两个独立的APK之间能够相互通信,...
Android AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于实现不同应用程序进程间的通信(IPC,...对于初学者来说,理解并熟练掌握AIDL的使用,将有助于提升Android开发能力。
在Android系统中,AIDL(Android Interface Definition Language)是一种用于实现进程间通信(Inter-Process Communication, IPC)的工具。AIDL使得不同进程间的组件能够相互通信,即便它们运行在不同的应用程序或...
在Android开发中,AIDL...理解和掌握AIDL的使用,对于提升Android应用的复杂性和可扩展性具有重要意义。通过分析和实践这个Demo,开发者将能够熟练运用AIDL进行服务的暴露和调用,进一步提升自己的Android开发技能。
Android AIDL(Android Interface Definition ...通过以上讲解,你应该对AIDL有了深入的理解,能够创建和使用AIDL接口实现Android应用的进程间通信。实践中,灵活运用AIDL可以极大地提升应用的功能性和可扩展性。
在这个"Android Aidl 测试Demo"中,包含了服务端(AidlServer)和客户端(AidlClient)的示例,帮助开发者更好地理解和应用Aidl。 首先,让我们详细了解一下服务端(AidlServer): 1. **创建AIDL接口**:在...
而Android Interface Definition Language(AIDL)是Google提供的一种用于处理进程间通信的语言,它允许应用程序之间透明地交换数据。当我们需要在不同的应用之间传递复杂的对象时,AIDL就显得尤为重要。本文将深入...
首先,我们需要理解Android中的服务(Service)和跨进程通信的重要性。服务是Android四大组件之一,它在后台执行任务,不与用户界面直接交互。在某些场景下,我们可能需要在一个进程中启动的服务被另一个进程调用,...
描述“android aidl跨进程通信例子,简单明了”提示我们,这个压缩包可能包含了一个简单的AIDL使用示例,帮助开发者理解如何实施这一机制。通常,一个简单的AIDL示例会包括以下步骤: 1. **定义接口**:首先,你...
在Android系统中,AIDL(Android Interface Definition Language)是一种接口定义语言,用于实现跨进程通信(IPC, Inter-Process Communication)。当多个客户端需要调用同一服务的代码时,AIDL就显得尤为重要。这篇...
在Android系统中,进程间通信(IPC,Inter-Process ...理解并熟练运用AIDL是开发高性能、多组件协作的Android应用的重要技能。通过学习和实践,开发者可以更好地掌握Android系统的精髓,提高软件的稳定性和用户体验。
在Android系统中,AIDL...总之,理解并熟练使用AIDL是Android开发中的重要技能,它有助于构建可扩展、健壮的多进程应用。通过深入学习AIDL,开发者能够更好地驾驭Android系统的进程间通信,提升应用的性能和用户体验。
在Android开发中,AIDL(Android Interface Definition Language)是一种用于跨进程通信(IPC,Inter-Process ...在实际开发中,理解并熟练掌握AIDL的使用,对于构建复杂、扩展性强的Android应用至关重要。
Android AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于处理进程间通信(IPC, Inter-Process ...理解并掌握AIDL,能有效提升你在Android应用开发中处理进程间通信的能力。