- 浏览: 1078456 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (202)
- Android (31)
- Eclipse 使用 (14)
- 笔记 (5)
- 杂七杂八 (3)
- Java (18)
- 数据库 (6)
- web (21)
- JavaScript (24)
- Http (1)
- 杂谈 (1)
- JSP & Servlet (5)
- log4j (1)
- Linux (13)
- MS Office (3)
- postgresql (7)
- Tomcat (5)
- windows (4)
- tmp (1)
- Perl (1)
- Struts2 (17)
- JQuery (5)
- HTML5 (3)
- JSLint (2)
- iphone (1)
- ant (2)
- IE (1)
- tcp (1)
- JBoss (4)
- 正则表达式 (2)
- jmeter (1)
- CI (1)
- sonarqube (1)
- junit (1)
- chrome (1)
- mybatis (2)
- mysql (3)
- spring (2)
- maven (1)
最新评论
-
天使建站:
看这里:jquery里和操作数组的相关的:$.merg ...
JQuery 数组 -
lgywindows:
我照你的方法实现了在java中取国际化。谢谢提供!
spring mvc中,如何在 Java 代码里,获取 国际化 内容 -
ylhkaixin:
请教下大神,我转换报告的时候报错:report: [x ...
通过ant来批量执行jmeter脚本,并生成报告(附: 生成报告时报“Content is not allowed in prolog”这个错误的解决方案) -
lemon_yt:
正在找
spring mvc中,如何在 Java 代码里,获取 国际化 内容 -
Rainbow702:
alike222 写道Rainbow702 写道MyDream ...
通过ant来批量执行jmeter脚本,并生成报告(附: 生成报告时报“Content is not allowed in prolog”这个错误的解决方案)
之前提及过,启动Service有两种方式:startService 与 bindService。前者已经说过如何使用,所以,这篇贴子主要是关于 bind service的。 这里所讨论的是仅针对那些被绑定的service的,而那些既被startService() 又被 bindService() 的 service 不在此范围内。
① Bind Service就像是C/S架构中的服务端,其他组件(比如 Activity)绑定到它(通过 bindService()),可以向它发送请求,可以接受从它返回的响应,它甚至还提供了进程间通信(IPC)功能。
② 一个service要想能够被其他组件绑定,那么它的 onBind() 方法必须被实现,且必须返回一个 IBinder 对象,然后其他组件可以通过这个 IBinder 对象与该 service 进行通讯。
③ 多个client可以绑定至同一个service,但该 service 的onBind() 方法只会在第一个 client 绑定至其的时候被调用,当其他 client 再次绑定到它的时候,并不会调用 onBind() 方法,而是直接返回第一次被调用时产生的那个 IBinder 对象。也就是说,在其生命周期内,onBind() 只会被调用一次。
④ Bind Service 的生命周期如下图所示:
⑤ Bind Service 不会在后台无限期的一直运行,而是当所有绑定至其的组件都调用了 unbindService() 进行解绑之后,系统就会将其停掉以回收资源。
⑥ 当我们要实现一个 Bind Service 的时候,最重要的就是实现它的 onBind() 方法以返回一个 IBinder 对象
要生成一个 Bound Service ,共有三种方式:继承自 Binder 类,使用 Messenger ,使用 AIDL。下面且听小生一一道来。
第一种:继承自 Binder 类
需要注意的是,这种方式仅仅适用于这种场合:service 与 application 在同一个进程中。这种场合也是最最常见的。
它分以下几个步骤:
a. 在你的 service 类中声明一个内部类来继承 Binder 类。在该内部类中,最好提供一个公共方法来返回你的 service 实例。
b. 在你的 service 类中需要声明一个这个内部类的实例,以供在 onBind() 方法中返回
c. 在 client 端,在 onServiceConnected() 方法中得到从 onBind() 方法中返回的 IBinder 对象,然后可以通过该 对象中的公共方法得到相应的 service 实例,正如 第一个步骤 所说的那样。
d. 在 service 中提供公共方法, 这样就可以在组件(如 Activity 中调用这些公共方法了)
下面给出一例:
service 代码
public class BindServiceWithIBinder extends Service { private static final String TAG = "BindServiceWithIBinder"; private final MyIBinder myIBinder = new MyIBinder(); /** * bindService() 时,调用的是这个方法,而非 onStartCommnad() 方法 */ @Override public IBinder onBind(Intent intent) { // 在主 Activity 上的 TextView 中打印出一行LOG MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> onBind")); return myIBinder; } @Override public void onCreate() { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> onCreate")); } @Override public void onDestroy() { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> onDestroy")); } @Override public void onRebind(Intent intent) { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> onRebind")); } @Override public int onStartCommand(Intent intent, int flags, int startId) { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> onStartCommand")); return START_STICKY; } @Override public boolean onUnbind(Intent intent) { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> onUnbind")); return super.onUnbind(intent); } /** * 声明一个 Binder 类的实现类,供在 onBind() 方法中返回该类的一个实例 * @author 001718 * */ public class MyIBinder extends Binder { public Service getService() { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, "BindServiceWithIBinder.MyIBinder.getService()")); return BindServiceWithIBinder.this; } } /** * service 提供的公共方法,在activity中可以调用 */ public void download() { try { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> download(): 文件下载中...")); Thread.sleep(3000); MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, TAG + " ----> download(): 文件下载完成...")); } catch (InterruptedException e) { e.printStackTrace(); } } }
主 Activity 中的相应关键代码为:
private void doUnbindService() { if (isBound) { unbindService(myLocalServiceConnection); isBound = false; } } private void doBindService() { Log.i("bind", "begin to bind"); bindService(intent, myLocalServiceConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection myLocalServiceConnection = new ServiceConnection() { public void onServiceConnected(android.content.ComponentName name, android.os.IBinder service) { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, "myServiceConnection.onServiceConnected")); // 因为 客户端 与 服务 在同一个进程内,这样一来,就可以知道参数 "service"的类型了,也就可以进行显示的强制类型转换了。 // 而如果 客户端与服务不在同一个进程中的话,那么此处是不可以进行显示强制类型转换的, // 因为,通过Debug,可以发现此时传进来的 Service 的类型是 BinderProxy MyIBinder myIBinder = (MyIBinder) service; bsi = (BindServiceWithIBinder) myIBinder.getService(); isBound = true; bsi.download(); }; public void onServiceDisconnected(android.content.ComponentName name) { MyServiceActivity.vh.sendMessage(MyServiceActivity.createMessage( MyServiceActivity.UPDATE_VIEW, "myServiceConnection.onServiceDisconnected")); isBound = false; }; };
下面来看运行效果:
连续点击两次 Bind Service
从此图中可以看出,bind service 的响应过程。也可以看到,第二次点击时,service 没作任何反应,因为当前 Activity 在第一次点击后就已经跟此service绑定了。
点击 Unbind Service
至此,该 service 的生命周期结束,它也会被系统给停掉以回收资源。
评论
哎,好久不做android了,写不了了啊。
关键代码都已贴出来了
发表评论
-
动态更新APK
2011-09-08 12:29 4360开发了一个APK后,往往后续需要进行更新升级。那么,当用户选择 ... -
Android数据保存之PreferenceActivity
2011-09-07 15:49 5749看到很多书中都没有对PreferenceActivit ... -
AsyncTask 的使用
2011-08-22 13:39 6030在开发Android应用时必须遵守单线程模型的原则: ... -
Android Service 之三(Bind Service,使用 AIDL)
2011-08-15 17:57 12140前面写了 Bind Service 的两种实现方式,接下来转一 ... -
Android Service 之三(Bind Service,使用 Messenger)
2011-08-15 17:26 10030上次讲了第一种 Bind Service 的实现方式,今天讲 ... -
Android NOtification 使用
2011-08-12 17:12 5004一、 Notification 简介 在 andro ... -
如何快速启动 Android 模拟器
2011-08-12 11:04 2496一直不知道在创建 AVD 时,那个 "enable ... -
Android 模拟器启动失败(SDL_app:emulator.exe )解决方法
2011-08-12 10:45 3534今天新建了一个AVD,给它划分了512MB的空间,然后启动之, ... -
android service 之二(IntentService)
2011-08-09 11:13 31685不管是何种Service,它默认都是在应用程序的主线程(亦即U ... -
android service 之一 (start service)
2011-08-08 15:45 13928我们有两种方式(start与bind)启动一个Service ... -
写Service Demo的时候遇到的一个问题小结一下
2011-08-08 14:29 8521我写了一个 Service 的Demo,但是将启动Servi ... -
百度Android工程师面试题
2011-07-28 09:49 2225百度Android工程师面试题 -
Android中UI主线程与子线程
2011-07-26 14:10 2101在一个Android 程序开始运行的时候,会单独启动一个Pro ... -
Android线程模型(Painless Threading)
2011-07-26 14:07 1561当第一次启动一个Android ... -
Android 之 传感器 应用
2011-07-26 10:42 5273传感器的使用 1.传感器类型: 方向、加速度(重力)、 ... -
Logcat出错:Could not create the view: For input string:
2011-07-22 13:39 2535使用eclipse开发android应用已经一年多了,但今 ... -
Goolge Map API 源码
2011-07-14 14:16 3861由于做GOOGLE MAP 的项目,所以就上网想找它的源码。结 ... -
如何用metersToEquatorPixels实现任意纬度的米到像素的转换
2011-07-14 13:40 4738今天又是神奇的发现:我希望在MapView的Overlay子类 ... -
申请 android google map API key(转)
2011-07-10 14:07 18451.首先要得到你的debug keystore位置: ... -
windows下如何批量下载android源码
2011-05-18 22:56 2599为了在windows下批量下载Android的源码,上网查 ...
相关推荐
这里,我们创建一个自定义的 Binder 类,它继承自 `IBinder` 接口,并实现我们需要暴露给其他进程的方法。例如: ```java public class MyBinder extends Binder { private final MyService myService; public ...
"Android Binder C/C++层实现示例"提供了一个实践性的学习资源,帮助开发者深入理解Binder机制的底层实现,包括Client和Server的交互、Parcel数据封装、Service Manager的使用等核心概念,从而提升对Android系统内核...
"service demo"是指一个示例程序,它展示了如何在Android应用中创建和使用Service,特别强调了"Binder"机制的使用。Binder是Android系统中的一个重要组件,它是进程间通信(IPC,Inter-Process Communication)的...
在Bound Service实现中,我们通常会创建一个继承自`Service`的类,并重写其中的关键方法,如`onBind()`、`onUnbind()`和`onRebind()`。`onBind()`方法是必选的,它返回一个实现了`IBinder`接口的对象,这个对象就是...
创建自定义Service时,需要继承自Android的Service类,并重写onStartCommand()或onBind()方法。onStartCommand()用于处理通过startService()启动的服务,而onBind()则为绑定服务提供接口。 在AndroidManifest.xml中...
在Android Studio中,可以通过新建一个类并继承自`Service`。例如,我们可以创建一个名为`MyService`的类,并重写`onStartCommand()`方法,这里是我们执行后台任务的地方。 2. **启动Service** 在`Activity`中启动...
1. 创建一个新的Service类,继承自`android.app.Service`。 2. 在Service类中重写关键方法,如`onStartCommand()`和`onBind()`。`onStartCommand()`用于启动服务并返回服务的启动行为,`onBind()`用于提供与服务进行...
Android 通过继承 Binder 类实现多进程通信 Android 操作系统中,多进程通信是一个非常重要的 topic,特别是在开发多进程应用程序时。Android 通过继承 Binder 类实现多进程通信是一种常见的解决方案。下面我们将...
Service通常继承自`android.app.Service`,但在需要前台服务的情况下,应继承自`android.app.ForegroundService`,以便系统不会因为内存不足而轻易停止服务。 在`DownloadService`中,我们定义一个内部类`...
1. 创建Service类:首先,你需要创建一个继承自`Service`的类,并重写`onBind()`方法,返回一个实现了`Binder`接口的对象,这是客户端与Service交互的桥梁。 ```java public class MyService extends Service { ...
在Android应用开发中,Service是四大组件之一,它在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨Android中的Start Service,这是一种启动Service的方式,它关注的是任务的启动而不是用户界面的反馈...
3. **实现 Service**:在 Service 实现类中,你需要继承 Stub 类,并重写其中的方法来实现具体的业务逻辑。同时,Service 的 `onBind` 方法应返回 Stub 实例,以便客户端可以通过 Binder 获得服务接口的代理对象。 ...
- YourServiceClass.java:这是Service的实现类,需要继承自Service并覆盖其生命周期方法。例如,可以在onStartCommand()中执行需要后台执行的任务。 - MainActivity.java:作为客户端,可以启动或绑定到Service。...
首先,我们需要创建一个继承自Service的类。在这个类中,我们需要创建一个Handler实例,这个Handler将接收并处理来自其他组件的消息。例如: ```java public class MyService extends Service { private final ...
Service的源码中,`Service`类是抽象的,实际使用时需要继承自`Service`并实现其抽象方法。`Context.startService()`最终会调用到`ServiceManager.addService()`,将Service添加到系统服务列表中。接着,系统会创建...
Android服务(Service)是Android操作系统中四个核心应用程序组件之一,其他三个分别是Activity、BroadcastReceiver和ContentProvider,它们在Android应用开发中的作用和使用场景各不相同。Service的作用主要体现在...
3. 实现服务:创建一个继承自`Service`的类,如`RemoteServiceImpl`,并实现AIDL接口: ```java public class RemoteServiceImpl extends Service { private final IRemoteService.Stub binder = new ...
1. **服务定义**:首先,你需要在服务类中继承自Service,并重写onBind方法。这个方法返回一个实现了Binder接口的对象,它将作为Activity和服务之间通信的桥梁。 ```java public class MyService extends Service {...
1. **创建Service类**:创建一个继承自`Service`的类,并重写关键方法,如`onCreate()`、`onStartCommand()`和`onBind()`。`onCreate()`在Service首次创建时调用,`onStartCommand()`处理来自`startService()`的命令...
2. 在C++层,我们需要实现`IAppPayProvider`的本地代理类,继承自`BBinder`,并重写`onTransact()`方法来处理客户端的请求。 3. 客户端通过`BinderTest`类调用`bindService()`方法连接到`AppPayProvider`,并使用...