startService和bindService的使用

Service 生命同期

在这里插入图片描述

startService 和bindService 区别

startService: onCreate -> onStartCommand -> onDestory ,在多次调用startService的时候,onCreate不重复执行,但是onStartCommand会执行。startService调用了这后,会一直存在,直到其调用了stopService。

bindService : onCreate -> onBind -> onUnbind -> onDestory,多次调用bindService,onCreate及onBind都只执行一次。它生命周期跟随其调用者,调用者释放的时候,必须对该Service解绑,当所有绑定全部取消后,系统即会销毁该服务。 bindService 的方式通过onServiceConnected()方法,获取到Service对象,通过该对象可以直接操作到Service内部的方法,从而实现调用者与Service之间的交互。

startService & stopService的生命周期

1、单独使用startService & stopService
2、单独使用bindService & unbindService
3、startService与bindService混合使用
使用场景:在activity中要得到service对象进而能调用对象的方法,但同时又不希望activity finish的时候service也被destroy了,startService和bindService混合使用就派上用场了。
(1)先调用startService,再调用bindService,生命周期如下:

startService(new Intent(this, MyService.class));
bindService(new Intent(this, MyService.class), mServiceConnection, Context.BIND_AUTO_CREATE);

onCreate() -> onStartCommand() -> onBind()

(2)先调用bindService,再调用startService,生命周期如下:

bindService(new Intent(this, MyService.class), mServiceConnection, Context.BIND_AUTO_CREATE);
startService(new Intent(this, MyService.class));

onCreate() -> onBind() -> onStartCommand()
(3)先调用startService又调用了bindService,他们对应的是同一个service对象吗?
是的。

使用场景

  • 如果想要启动一个后台服务长期进行某项任务,那么使用startService
  • 如果只是短暂的使用,那么使用bindService。
  • 如果想启动一个后台服务长期进行任务,且这个过程中需要与调用者进行交互,那么可以两者同时使用,或者使用startService + BroadCast / EventBus等方式
  • 对于既使用startService,又使用bindService的情况,结束服务时需要注意的事项:Service的终止,需要unbindService和stopService都调用才行;

参考:
startService和bindService的区别,生命周期以及使用场景
【Android】startService和bindService混合使用总结

### Android StartService BindService 的生命周期详解 #### 一、StartService 的生命周期 当通过 `startService()` 方法启动一个 Service 时,该 Service 将独立于客户端运行。即使启动它的组件被销毁,Service 仍然会继续运行直到显式调用 `stopSelf()` 或者其他组件调用了 `stopService()`。 以下是 StartService 的典型生命周期方法及其触发条件: - **`onCreate()`**: 当第一次创建 Service 时会被调用一次[^2]。 - **`onStartCommand(Intent intent, int flags, int startId)`**: 每次调用 `startService()` 都会触发此方法。它接收传递过来的 Intent 对象以及一些标志位参数[^4]。 - **`onDestroy()`**: 当 Service 被停止或者终止时调用。通常在此处释放资源或清理操作。 如果多次调用 `startService()` 并不会重新创建新的实例而是再次回调 `onStartCommand()` 函数[^3]。 ```java @Override public void onCreate() { super.onCreate(); Log.d("Lifecycle", "onCreate called"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("Lifecycle", "onStartCommand called with startId: " + startId); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.d("Lifecycle", "onDestroy called"); } ``` #### 二、BindService 的生命周期 当通过 `bindService()` 绑定到某个 Service 上时,这个 Service 只会在有至少一个绑定存在的情况下保持活动状态。一旦所有的绑定都解除,则除非之前已经由 `startService()` 开始过,否则系统将会销毁该 Service 实例[^1]。 下面是 BindService 的主要生命周期阶段描述如下: - **`onCreate()`**: 如果当前还没有创建任何实例的话,在首次建立连接前先执行本函数。 - **`onBind(Intent intent)`**: 返回 IBinder 接口对象给调用方用于通信目的;每当有一个新客户成功绑定了服务端就会进入这里处理逻辑。 - **`onUnbind(Intent intent)`**: 在最后一个绑定断开之后立即调用,并询问是否要重建绑定关系。 - **`onRebind(Intent intent)`**: 若前面选择了重连选项(`true`) ,那么当下次又有新绑定请求到来的时候便会走这条路径而不是直接新建另一个 session。 - **`onDestroy()`**: 像上面提到的一样只有在没有任何剩余绑定并且也没有通过 start 方式激活的前提下才会真正结束掉整个进程并且回收内存空间。 下面是一个简单的例子展示如何实现可绑定的服务类定义: ```java private final IBinder binder = new LocalBinder(); @Override public IBinder onBind(Intent intent) { Log.d("Lifecycle", "onBind called"); return binder; } @Override public boolean onUnbind(Intent intent) { Log.d("Lifecycle", "onUnbind called"); return true; // Indicate whether you want to receive the onRebind(). } @Override public void onRebind(Intent intent) { Log.d("Lifecycle", "onRebind called"); } ``` #### 三、同时使用 StartService BindService 的情况下的生命周期行为 在这种混合模式下,Service 不仅可以作为单独工作的后台任务来维持自己的生命期,还可以允许外部应用与其进行交互通讯。具体表现为以下几点特性: - 初始状态下可能因为某些原因既需要长期存活又得提供接口供第三方访问所以两者兼而有之; - 此刻无论哪一方主动发起关闭动作都不会立刻影响另一部分功能正常运作直至完全脱离关联为止才彻底消亡。 总结来说就是只要任意一种形式还有效就足以支撑起整体框架结构不崩溃倒塌下去而已。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值