首页 » 排名链接 » 「Android -- 开发」Service 服务的开发方法(服务方法调用绑定启动)

「Android -- 开发」Service 服务的开发方法(服务方法调用绑定启动)

乖囧猫 2024-11-25 13:15:22 0

扫一扫用手机浏览

文章目录 [+]

Service中定义的生命周期方法,对Service服务的开发大部分工作就围绕以下几个方法进行操作:

void onCreate():当该Service第一次被创建后将立即回调该方法。
void onStartCommand(Intent intent,int flags,int startId):每次通过startService()方法启动Service时都会被回调。
void onDestroy():当Service被关闭前会被回调。
abstract IBinder onBind(Intent intent):该方法是Service子类必须实现的方法,如果不需要通过绑定的方式启动服务,可以返回Null。
boolean onUnbind(Intent intent):当Service上绑定的所有客户端都断开连接将回调该方法。

通过服务的启动方式与适用范围,可将服务分为两类服务:

start:启动服务,当一个Android组件(如一个Activity)调用startService()的时候,启动一个服务。
服务一旦启动,就可以一直在后台运行下去,即使这个启动它的组件被摧毁。
这样的服务模式,通常用于执行一个操作而不需要返回结果给调用者。
Bound:绑定服务,当一个Android组件(如一个Activity)调用bindService()。
一个绑定服务提供了一个客户端到服务端的接口,允许组件与服务之间进行交互,这样可以实现跨进程的通信。
绑定服务的生命周期默认是跟随它的绑定组件的,但是一个绑定服务可以绑定多个Android组件,如果这些Android组件都被销毁,那么这个绑定服务也将被销毁。

虽然上面提到了服务有两种类别,但是一个服务类所要继承的类是一样的,都是Service类。
也就是说,一个服务,可以包含上面两种运行方式的服务,只是与它重载的方法有关,如果重写了onStartCommand()即支持启动服务,如果重写onBiind()即支持绑定服务,所以如果同时重载实现这两个方法即可实现两种服务。

「Android -- 开发」Service 服务的开发方法(服务方法调用绑定启动) 排名链接
(图片来自网络侵删)
service 服务 start 的测试一、 在 MainActivity 中创建方法 startService,启动服务:

public void startService(View view) { Intent intent = new Intent(); intent.setClass(MainActivity.this, NormalServices.class); startService(intent);}

二、 在 MainActivity 中创建方法 stopService,停止服务:

public void stopService(View view) { Intent intent = new Intent(); intent.setClass(MainActivity.this, NormalServices.class); stopService(intent);}

三、 运行的结果如下:点击start:

03-24 19:28:40.130 9986-9986/com.example.linux.serviceslifetest I/NormalServices: NormalServices constructor.03-24 19:28:40.130 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on create.03-24 19:28:40.130 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on start command.点击stop:

03-24 19:31:18.730 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on destory.点击start:

03-24 19:32:23.660 9986-9986/com.example.linux.serviceslifetest I/NormalServices: NormalServices constructor.03-24 19:32:23.660 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on create.03-24 19:32:23.660 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on start command.点击start:

03-24 19:33:06.350 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on start command.点击stop:

03-24 19:33:30.240 9986-9986/com.example.linux.serviceslifetest I/NormalServices: on destory.

四、 对于上述结果的分析:当service第一次创建启动(start方法触发):

  service的构造方法:

  oncreate方法

  onStartCommand方法

stop方法触发时,关闭服务:

  on destory

如果service没有被destory,那么随后点击start,只会执行onStartCommand方法service 生命周期一、 启动与停下服务:

一旦在项目的任何位置调用了Context 的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法。
如果这个服务之前还没有创建过,onCreate()方法会先于onStartCommand()方法执行。
服务启动了之后会一直保持运行状态,直到stopService()或stopSelf()方法被调用。
注意虽然每调用一次startService()方法,onStartCommand()就会执行一次,但实际上每个服务都只会存在一个实例。
所以不管你调用了多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止下来了。

二、 绑定与解绑服务:

另外,还可以调用Context 的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。
类似地,如果这个服务之前还没有创建过,onCreate()方法会先于onBind()方法执行。
之后,调用方可以获取到onBind()方法里返回的IBinder 对象的实例,这样就能自由地和服务进行通信了。
只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。

三、 启动与绑定服务:

当调用了startService()方法后,又去调用stopService()方法,这时服务中的onDestroy()方法就会执行,表示服务已经销毁了。
类似地,当调用了bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行,这两种情况都很好理解。
但是需要注意,我们是完全有可能对一个服务既调用了startService()方法,又调用了bindService()方法的,这种情况下该如何才能让服务销毁掉呢?根据Android 系统的机制,一个服务只要被启动或者被绑定了之后,就会一直处于运行状态,必须要让以上两种条件同时不满足,服务才能被销毁。
所以,这种情况下要同时调用stopService()和unbindService()方法,onDestroy()方法才会执行。

特别注意:

1、你应当知道在调用 bindService 绑定到Service的时候,你就应当保证在某处调用 unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自      动解除,并且Service会自动停止);

2、你应当注意 使用 startService 启动服务之后,一定要使用 stopService停止服务,不管你是否使用bindService;

3、同时使用 startService 与 bindService 要注意到,Service 的终止,需要unbindService与stopService同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如Activity 被 finish 的时候)之后服务才会自动停止;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity 如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService 建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。

5、在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart 任然有效。
这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其以后的版本,那么你应当使用 onStartCommand 而不是 onStart。

文末

我从去年开始接触Android开发,以下结合自己的一点项目经验,同时参考了Google的优化文档和网上的诸多技术大牛给出的意见,整理出这份电子手册《Android 开发学习笔记》,私信发送 "进阶" 即可 免费获取;这份笔记里面汇总了我从事 Android 开发行业以来遇到的 技术难点问题,相信可以帮助到大家

资料整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下~

你的支持,就是我的动力;祝各位前程似锦

标签:

相关文章