启动一个service有两种方式:
- 通过Context的startService()方法:通过该方法启动service,访问者与service之间没有关联,即使访问者退出了,Service仍然正常运行。
- 通过Context的bindService()方法:使用该方法启动service,访问者与Service绑定在一起,访问者一旦退出,Service也就终止。
Caution:一个service运行在宿主进程的主线程中——service不创建自己的线程,并且不运行在一个单独的进程中。意思就是说,如果你的service打算做一些使用cpu密集的工作或者阻塞的操作(例如MP3播放或者网络操作),你必须创建一个新的线程去做一些工作。使用一个单独的线程,你可以减少出现ANR的几率,并且应用的主线程可以专注于和用户交互。
上面说了,在service线程是在主线程中运行的,所以不能执行耗时任务,如果要执行耗时任务可以在onStartCommand方法中启动一个子线程,其实service还提供了另一个方案,那就是IntentService,他是Service的子类。下面翻译一些官方的文档,对IntentService做个介绍。
IntentService 是Service的子类,他使用一个工作线程去处理所有的请求,每次处理一个。如果你不需要大量的同步请求,这是一个非常好的选项。你要做的就是实现onHandleIntent()方法,他接受intent请求,并在后台线程中处理。
IntentService做一下的事情:
- 创建一个默认的工作线程,来处理所发送到onStartCommand() 的intent请求,并且和你的主线程分开。
- 创建一个工作队列,并每次传送一个intent到onHandleIntent()方法,所以,你从来不用担心多线程的问题。
- 到任务执行完成,service自动停止,所有你从来不用调用
stopSelf()
.方法 - 提供onBind()的默认实现,并返回null。
- 提供
onStartCommand()
方法的默认实现,并把intent传递给工作队列,然后发送给onStartCommand(),。
关于onStartCommand() 方法的返回值:
此方法的返回值一定是一个整数,系统根据这个值来决定当onStartCommand() 方法执行完成后,系统由于某种原因关闭服务后将如何处理。返回值为如下几个:
- START_NOT_STICKY 如果onStartCommand() 执行完毕后,系统意外关闭服务,系统不会重启服务。
- START_STICKY 如果onStartCommand() 执行完毕后,系统意外关闭服务,会重新创建服务并调用onStartCommand() 方法,但是不会重新发送intent,而是给onStartCommand() 一个null的intent。
- START_REDELIVER_INTENT 如果onStartCommand() 执行完毕后,系统意外关闭服务,会重新创建服务并调用onStartCommand() 方法,但是不会重新发送intent,而是给onStartCommand() 一个最后发送的intent。
相关推荐
Service启动时会调用`onStartCommand()`方法,你可以在这个方法中执行后台任务。返回值可以是START_STICKY、START_NOT_STICKY或START_REDELIVER_INTENT,它们会影响Service被系统杀死后的行为。 3.2. onBind() ...
本篇文章将深入探讨“android学习之Service启动1”的主题,主要关注Service的启动方式及其基本用法。 首先,Service有两种启动模式:startService()和bindService()。`startService()`主要用于启动一个无需与调用者...
在Service的启动方式上,有两种主要的方法: 1. **onStartCommand()** 方式:这是通过调用startService()方法启动Service的方式。当Service被启动时,系统会调用onStartCommand()方法,你可以在这个方法中执行需要...
Service的启动有两种方式:通过调用`startService()`和`bindService()`。前者用于无绑定地启动Service,适合执行一次性任务,如发送网络请求;后者将Service与客户端绑定,允许进行双向通信,适合需要持续交互的场景...
Android中的Service分为两种类型:标准Service和IntentService。标准Service需要手动管理和停止,而IntentService则会自动处理工作队列并在任务完成时自我销毁。 2. **服务的生命周期**: Service的生命周期由...
Service有两种启动方式:显式启动和隐式启动。显式启动是通过Intent直接指定Service的类名,而隐式启动则通过设置Intent的ACTION、CATEGORY等过滤器,让匹配的Service启动。在大多数情况下,我们使用显式启动。 ...
创建Service主要有两种方式:通过继承`Service`类和实现其生命周期方法,或者使用`IntentService`,这是一种已经封装好的单线程Service,适用于执行简单的异步任务。 1. **创建自定义Service** - 首先,继承`...
本篇文章将深入探讨两种启动Android服务的方式:startService和bindService,以及IntentService类的使用。 **1. startService()** `startService()` 是我们最常用来启动服务的方法。当你调用这个方法时,Android...
Service有两种启动方式:显式启动(通过startService())和隐式启动(通过Intent和ACTION声明)。 1. 显式启动:当调用Context的startService()方法时,Service会按照顺序执行onCreate() -> onStartCommand() -> on...
Service分为两种类型:标准Service和IntentService,标准Service需要开发者手动管理线程,而IntentService则自动在一个工作线程中处理请求。 二、Service生命周期 Service的生命周期由四个主要方法组成: 1. ...
Service有两种启动方式:显式启动(通过指定服务类名)和隐式启动(通过Intent匹配)。显式启动通常用于应用内部,而隐式启动则常用于跨应用调用。 对于长时间运行的任务,Service可以使用IntentService。...
首先,Android的Service组件主要分为两种类型:标准Service和IntentService。在这个描述中,可能是使用了标准Service,因为IntentService会自动处理工作线程并结束自身,而这里需要在用户退出时手动停止音乐播放。 ...
Service的启动有两种方式:startService()和bindService()。startService()用于启动一个Service并执行onStartCommand()方法,而bindService()则是连接到Service,调用onBind()方法,通常用于交互式通信。 1. **停止...
Service主要分为两种类型:标准Service和IntentService。标准Service在主线程中运行,开发者需要自行管理线程;IntentService则会自动在工作线程中处理任务,任务完成后自动停止,适合执行一次性任务。 在创建...
`Service`分为两种主要类型:普通`Service`和`IntentService`,这两种服务都可以实现后台任务,但它们的运行方式和特性有所不同。 ### 普通Service 普通`Service`在后台线程中运行,它没有自己的工作线程,而是直接...
创建BroadcastReceiver主要有两种方式: 1. **静态注册**: 在AndroidManifest.xml中声明BroadcastReceiver,系统启动时会自动创建。这种方式接收系统广播,但可能会增加应用的内存占用。 2. **动态注册**: 在代码...
Service有两种启动方式:启动模式和服务绑定。启动模式下,Service会持续运行,直到stopService()或stopSelf()被调用,适用于不需与Activity交互的后台任务。绑定模式下,Service与启动它的Activity有强关联,两者...
Android中的Service分为两种类型:标准Service和IntentService。标准Service需手动停止,而IntentService会在任务完成后自动停止。 ### 同一进程内的Service 在同一应用同一进程内部使用Service,意味着Service与...
Service有两种主要类型: 1. Started Service:由startService()方法启动,这种服务通常执行一个单一任务,完成后自动停止。开发者无需关心Service的生命周期管理,因为系统会在任务完成时自动销毁它。 2. Bound ...
这两种启动方式有不同的应用场景,startService适合执行一次性任务,而bindService适合需要与Service进行交互的情况。 Service的生命周期包括`onCreate()`,`onStartCommand()`,`onBind()`,`onUnbind()`,`onDestroy...