启动一个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和intentservice的使用和其中应该注意的部分
service中1需要手动开启子线程2服务开启之后会一直运行,需要手动调用stopService();或者stopSelf(); intentService是一种异步(子线程)、自动停止的服务,这个例子测试IntentService的特征
3. 在ServiceDemoActivity.java中都调用了两个service,调用service自行屏蔽调用IntentServiceServie,调用IntentServiceServie自行屏蔽调用service。 4. 仅仅是个例子,对比这个service和IntentServiceServie的区别...
再开始之前我们还是先介绍下service吧:此处用的是IntentService,至于和常规的service有什么区别呢? 有了Service为什么还要有个IntentService呢? 原因如下: 1)Service默认运行在主线程中,IntentService运行在一个...
IntentService基本使用方法Demo
主要介绍了Android系统中Service和IntentService的区别,与普通的服务相比,IntentService可以开启单独的线程来处理intent请求,需要的朋友可以参考下
NULL 博文链接:https://zhanglimijavaeye.iteye.com/blog/1881599
android开启服务的两种方式,startService和bindService,文档还IntentService类
一个IntentService的简单使用
Android线程,线程池,AsyncTask,HandlerThread和IntentService的用法demo
对于有写工作,我们需要在后台进行,这里主要介绍了使用IntentService轻松实现模拟上传图片的例子。对于IntentServixce和Service扩展类的使用区别,大家可以自行去了解研究一下。
Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务
博客地址:...IntentService是继承于Service并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统 Service 一样
IntentService简单demo,对应博文 http://blog.csdn.net/tianmi1988/article/details/50520339
Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中; Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务; 二、IntentService特征 会创建独立的worker线程来...
实现连接IntentService,打印输出日志
Android 中IntentService的简单应用