service两种启动方式的区别

本文详细介绍了Android中的服务(Service)的概念及两种启动方式:startService() 和 bindService()。服务是用于实现程序后台运行的一种机制,适合执行长时间且无需与用户交互的任务。文章还对比了这两种启动方式的特点和生命周期。

service,中文名称是服务,服务是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互,而且还要长期运行的任务。

服务运行不依赖于任何用户界面,即使程序切换到后台,或者用户打开另一个应用程序,服务仍然能够保持正常运行。

不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖于创建服务时所在的应用程序进程。当某个应用程序进程被杀掉时,所以依赖于该进程的服务也会停止运行。

另外,也不要被服务的后台概念所迷惑,实际上服务并不会自动开启线程,所有的代码都是默认运行在主线城当中的。也就是说,我们需要在服务的内部手动创建子线程,并在这里执行具体任务,否则就有可能出现主次线程被阻塞住的情况。

service有两种启动方式,一种是通过 startService() 来启动的,另一种是通过 bindService() 来启动的。

第一种:通过 startService() 来启动

通过 startService() 来启动方式的生命周期如下:
这里写图片描述

使用Service的步骤如下:

  1. 定义一个类,并继承 Service
  2. 在 AndroidManifest.xml 文件中配置此 Service
  3. 使用 Context 的 startService(Intent) 方法来启动 Service
  4. 不使用该服务时,调用 stopService(Intent) 方法停止此 Service

如果服务已经开启,就不会重复的执行 onCreate() ,而是调用 onStart() 或 onStartCommand()。而服务停止的时候调用 onDestory() 。

特点:

  • 一旦服务开启跟开启者就没有任何关系;
  • 开启者退出之后,服务还是可以在后台长期运行的。前提是没有调用 stopService(Intent);
  • 开启者不能调用服务里面的方法


第二种:通过 bindService() 来启动

通过 bindService() 来启动方式的生命周期如下:
这里写图片描述

使用Service的步骤如下:

  1. 定义一个类,并继承 Service
  2. 在 AndroidManifest.xml 中配置此 Service
  3. 使用 Context 的 bindService(Intent, ServiceConnection, int) 方法来启动此 Service
  4. 不使用该服务时,调用 unbindService(ServiceConnection) 方法停止此 Service

绑定服务不会调用 onStart() 或 onStartCommand() 方法。

特点:

  • bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。
  • 绑定者可以调用服务里面的方法。
在Android中,启动Service主要有两种方式:**Started Service**(启动式服务)和**Bound Service**(绑定式服务)。它们的主要区别如下: ### **1. Started Service(启动式服务)** #### **启动方式** - 通过 `startService()` 启动,例如: ```java Intent intent = new Intent(this, MyService.class); startService(intent); ``` #### **特点** - **独立性**:Service 独立运行,即使启动它的组件(如Activity)被销毁,Service仍然可以继续运行。 - **生命周期**:直到 `stopSelf()` 或 `stopService()` 被调用才会停止。 - **通信方式**: - 一般使用 `Intent` 传递数据。 - 如果Activity需要接收Service的结果,可以结合 `BroadcastReceiver` 或 `ResultReceiver` 进行回调。 #### **适用场景** - 后台执行长时间任务(如下载、播放音乐)。 - 不需要与UI组件(Activity/Fragment)频繁交互的任务。 --- ### **2. Bound Service(绑定式服务)** #### **启动方式** - 通过 `bindService()` 绑定,例如: ```java Intent intent = new Intent(this, MyService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); ``` #### **特点** - **依赖绑定组件**:Service 的生命周期与绑定的组件(如Activity)关联,当所有绑定组件都解绑后,Service会自动销毁(除非也使用了 `startService`)。 - **通信方式**: - 通过 `ServiceConnection` 获取 `IBinder` 进行直接交互。 - 可以使用 **AIDL(Android Interface Definition Language)** 进行跨进程通信(IPC)。 - **生命周期**: - 当所有绑定组件都调用 `unbindService()` 后,Service 会被销毁(除非它同时被 `startService()` 启动)。 #### **适用场景** - 需要与Activity/Fragment频繁交互(如实时更新UI)。 - 需要跨进程通信(如不同APP之间的服务调用)。 - 提供C/S模式的接口调用(如远程数据库访问)。 --- ### **3. 混合模式(Started + Bound Service)** - **同时使用 `startService()` 和 `bindService()`**: - Service 会在 `startService()` 后长期运行,即使所有绑定组件解绑,也不会立即销毁(除非调用 `stopService()` 或 `stopSelf()`)。 - 适用于 **既需要后台运行,又需要交互** 的场景(如音乐播放器)。 --- ### **4. 对比总结** | 特性 | Started Service | Bound Service | |------|----------------|--------------| | **启动方式** | `startService()` | `bindService()` | | **生命周期** | 独立运行,需手动停止 | 依赖绑定组件,解绑后自动销毁 | | **通信方式** | `Intent`、`Broadcast` | `IBinder`、`AIDL` | | **适用场景** | 后台任务(下载、音乐) | 频繁交互(UI更新、IPC) | | **是否跨进程** | 一般单进程 | 支持跨进程(AIDL) | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值