Android StartService和BindService

一、Service相关方法

  • startService(),开启一个服务,可以在系统后台Running Apps里面看到服务在运行,不依赖于具体的某个组件,开启后会调用Service的onStartCommand()方法。
  • stopService(),停止一个服务,停止后Running Apps里面看不到服务在运行。
  • bindService(),绑定一个服务,绑定到具体组件上——Activity, Service, ContentProvider(BroadcastReceiver不行),会调用Service的onBind()/onRebind()方法,绑定时需要传入实现了ServiceConnection的对象,Service连接成功时会调用onServiceConnected()方法。 一个Service的onBind()/onUnbind()方法只会在第一个绑定它的组件绑定/解绑时执行。
  • unBindServce(),解绑一个服务,会将服务从相应组件上解绑,会调用Service的onUnBind()方法。

二、Service生命周期

startService()可以看作开启了一个服务,只有调用stopService()或stopSelf()才可以将其停止。

bindService()可以看做将服务绑定到组件中,生命周期随组件而定,直到组件销毁或者unBindService()后才消失。当没有startService时,bindService()首先会创建一个Service再进行绑定。如果已经有开启的Service,则会直接绑定。

  • 调用startService()后会执行onCreate()——>onStartCommand(),onCreate()只会执行一次,再次调用startService()只会执行onStartCommand()。调用stopService()后执行onDestroy()停止Service。
  • 调用bindService()后会执行onCreate()——>onBind()——>onServiceConnected(),同一组件只能绑定同一Service一次。调用unBindService()后执行onUnbind()——>onDestroy()停止。
  • 先调用startService(),会执行onCreate()——>onStartCommand()来启动Service,再调用bindService()会执行onBind()——>onServiceConnected()将Service绑定到组件中。然后
    • 调用unBindService()会执行onUnBind()来解除绑定,但此时Service并没有停止,调用stopService()后会执行onDestroy(),此时Service才停止。
    • 调用onStopService()后Service因为与组件绑定不会立即停止, 调用unBindService()后会执行onUnbind()——>onDestroy(),此时Service停止。
  • 先调用bindService(),再调用startService(),结果与3类似。
  • 一个Service的onBind()/onUnbind()方法只会在第一个绑定它的组件绑定/解绑时执行。例如Activity1调用了bindService(),那么onBind()方法会被调用,此时开启Activity2,再次调用bindService()则不会执行onBind()方法,而只会调用onServiceConnected()方法,此时调用unBindService()也不会调用onUnbind()方法,只有Activity1调用unBindService()才会执行onUnbind方法()。
  • onRebind()方法:当一个Service存在时,调用bindService()方法绑定,会调用onBind(),然后调用unBindService()方法解除绑定,会调用onUnbind(),此时如果再调用bindService绑定时(不管绑定者是不是当前组件),则会调用onServiceConnected()——>onRebind()方法。

    具体的生命周期图如下图所示:
    Service生命周期图

Demo地址:http://download.youkuaiyun.com/detail/kasogg/9256869

### 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、付费专栏及课程。

余额充值