Service 生命周期和使用注意项

本文详细阐述了Android系统服务的两大类型:本地服务和远程服务。解释了服务的生命周期和如何实现服务的启动与停止。同时介绍了IntentService类,用于处理异步请求并自动停止。最后讨论了服务在实际应用中的作用以及使用方法。

1.服务一般分为两种

      1.1:本地服务, Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。
      1.2:远程服务, Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加 载它。

   Service的生命周期

     

  context.startService() ->onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy() 

  context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy() 

  2. 同一服务,多次启动,服务实际执行的过程 

    第一次 启动服务时,运行 onCreate -->onStartCommand,后面在启动服务时,服务只执行onStartCommand,在实际使用过程中,通过Intent 传递数据,在             OnStartCommand中执行。

如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行

 3.IntentServie讲解

 IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个
所有请求都在一个单线程中,不会阻塞应用程序的主线程(UI Thread),同一时间只处理一个请求。
那么,用IntentService有什么好处呢?首先,我们省去了在Service中手动开线程的麻烦,第二,当操作完成时,我们不用手动停止Service

### Android Service 生命周期方法详解 Android 中的 `Service` 是一个可以在后台运行的组件,用于执行长时间运行的任务或为其他应用提供服务。其生命周期由一系列回调方法组成,这些方法定义了 `Service` 的创建、启动、绑定销毁过程。 #### 1. 手动调用的方法 以下是开发者可以直接调用的 `Service` 方法及其作用[^4]: - **`startService()`**:启动 `Service`,触发 `onStartCommand()` 方法。 - **`stopService()`**:停止由 `startService()` 启动的 `Service`,触发 `onDestroy()` 方法。 - **`bindService()`**:绑定到 `Service`,触发 `onBind()` 方法。 - **`unbindService()`**:解除与 `Service` 的绑定,可能触发 `onUnbind()` 方法。 #### 2. 自动调用的方法 以下是由系统自动调用的 `Service` 生命周期方法及其作用[^4]: - **`onCreate()`**:当 `Service` 第一次被创建时调用。无论通过 `startService()` 还是 `bindService()` 启动,该方法只会被调用一次[^3]。 - **`onStartCommand()`**:当 `Service` 通过 `startService()` 启动时调用。此方法可以返回一个标志位,指示 `Service` 在异常终止后是否需要重启[^1]。 - **`onDestroy()`**:当 `Service` 被停止或销毁时调用。在此方法中可以释放资源[^1]。 - **`onBind()`**:当 `Service` 被绑定时调用。此方法需要返回一个 `IBinder` 对象,用于客户端与 `Service` 之间的通信[^2]。 - **`onUnbind()`**:当最后一个客户端解除绑定时调用。此方法可以返回一个布尔值,指示是否需要调用 `onRebind()`[^3]。 - **`onRebind()`**:当新的客户端在 `onUnbind()` 返回 `true` 后重新绑定时调用。 #### 3. 不同启动方式下的生命周期 `Service` 的生命周期因启动方式不同而有所差异: - **`startService()` 方式**: - 调用顺序:`onCreate()` → `onStartCommand()`。 - 当调用 `stopService()` 或 `stopSelf()` 时,会触发 `onDestroy()`[^1]。 - **`bindService()` 方式**: - 调用顺序:`onCreate()` → `onBind()`。 - 当所有客户端都调用 `unbindService()` 时,会触发 `onUnbind()` `onDestroy()`。 #### 4. 示例代码 以下是一个简单的 `Service` 实现示例: ```java public class MyService extends Service { @Override public void onCreate() { super.onCreate(); // 初始化操作 System.out.println("Service created"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 处理启动命令 System.out.println("Service started"); return START_STICKY; // 指示系统在异常终止后重启服务 } @Override public IBinder onBind(Intent intent) { // 返回 Binder 对象以支持绑定 return null; } @Override public boolean onUnbind(Intent intent) { // 解绑时的操作 System.out.println("Service unbound"); return super.onUnbind(intent); } @Override public void onDestroy() { super.onDestroy(); // 释放资源 System.out.println("Service destroyed"); } } ``` #### 5. 注意 - 如果 `Service` 同时通过 `startService()` `bindService()` 启动,则需要分别调用 `stopService()` `unbindService()` 才能销毁 `Service`[^3]。 - 在 `onDestroy()` 方法中确保释放所有占用的资源,例如关闭线程或取消网络请求[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值