Android-Service和Thread

学习自

郭霖的博客

服务是运行在主线程上的

可能在我们第一次接触到Service的时候都是对于 __服务是运行在主线程上的 __这一现象不太理解,但是事实上确实是如此。尽管Service是运行与后台的这个特性比较让我们误解。但是请不要将Service的后台和Thread弄混了,这两个没有任何的关系。Service的目的是,做一些持续性的操作,即使当所有的Activity都退出了,但是Service也不会被结束。Service 也是我们开发的APP程序的一部分,只不过Activity负责门面而Service负责在幕后工作,比如说发送心跳包,播放音乐等。

关于服务是运行在主线程上的我们可以通过打印Thread的ID来证明

//在Activity的onCreate方法中获取线程的ID
"Activity: Current thread id is ${Thread.currentThread().id}".logE()
//输出结果:Current thread id is 2
//在Service的onCreate方法中获取线程的ID
"Service: Current thread id is ${Thread.currentThread().id}".logE()
//输出结果:Service: Current thread id is 2

在服务中开启线程

因为Service是运行在主线程上的所以,当我们在Service执行一些操作的时候,我们往往需要开启线程来帮助我们完成。一个比较标准的服务可以写成下面这样:

class TestService : Service() {
private val mTestBinder = TestBinder() /**
* 返回Binder
* */
override fun onBind(intent: Intent?): IBinder {
return mTestBinder
} //在这里完成一些初始化操作
override fun onCreate() {
super.onCreate()
} override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
thread {
//do some thing
}
return super.onStartCommand(intent, flags, startId)
} //在这里回收资源
override fun onDestroy() {
super.onDestroy()
} inner class TestBinder : Binder() {
fun startDownload() {
thread {
//do some thing
}
}
}
}

或许你比较疑惑,既然使用了Service还得开启线程,那么为什么还要使用Service呢,直接在Activity中开启线程不就结了。原因是: 在Activity中的线程没有很好的可操作性,比如在Activity创建的时候开启了线程,如果Activity关闭了的话,那么我们再也没有办法拿到在关闭的Activity中开启的线程的实例了,这显然是很容易造成不可预料的后果的。而在Service则不一样,Service在任意的一个Activity中都可以随意的访问,如果通过了混合方式开启了Service的话,即使一个Activity解除了Bind,Service依然是存在的,仅仅是连接断开了。

Android-Service和Thread的更多相关文章

  1. Android Service和Thread的关系

    不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...

  2. Android Service与Thread的区别

    Android Service,后台,Android的后台就是指,它的运行是完全不依赖UI的.即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行.比如说一些应用程序 ...

  3. Android Service 与 Thread 的区别

    Ref:http://blog.csdn.net/jiangwei0910410003/article/details/17008687 1). Thread:Thread 是程序执行的最小单元,它是 ...

  4. Android - service and thread

    服务(Service)是Android中实现后台程序运行的方案.适合执行那些不需要和用户交互并长期执行的任务. 服务并非运行在一个独立的进程中,而是依赖于创建服务时所在的应用程序.当某个应用程序进程被 ...

  5. Android service与Thread

    很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下. 1). Thread:Thre ...

  6. Android 轮询之 Service + AlarmManager+Thread (转)

    android中涉及到将服务器中数据变化信息通知用户一般有两种办法,推送和轮询. 消息推送是服务端主动发消息给客户端,因为第一时间知道数据发生变化的是服务器自己,所以推送的优势是实时性高.但服务器主动 ...

  7. 【转】Android开发:Service和Thread的关系

    不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Th ...

  8. android Service介绍

    一.简介 android中service(服务)运行于后台,没有界面.和其他组件一样,service也运行在主线程中,因此不能用它来做耗时的请求或者动作.可以在服务中开启线程,在线程中做耗时操作.可以 ...

  9. Android Service提高

    我们从以下几个方面来了解Service IntentService的使用 Service与Thread的区别 Service生命周期 前台服务 服务资源被系统以外回收处理办法 不被销毁的服务 Inte ...

  10. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

随机推荐

  1. RabbitMQ的安装部署

    RabbitMQ安装部署 一.软件准备 wget http://erlang.org/download/otp_src_19.3.tar.gz wget http://www.rabbitmq.com ...

  2. Object类型的怎么判断空值

    例如 Object result; 我直接这样是不行的 if(result==null) //这样是错的 ... 要这样判断 if(result == System.DBNull.Value) //这 ...

  3. angular模块

    深入浅析AngularJS中的模块 模块是AngularJS应用程序的一个组成部分,模块可以是一个Controller.Service服务.Filter过滤器.directive指令,这些都属于模块. ...

  4. haproxy acl访问限制IP

    http-request: 7层过滤 tcp-request content: tcp层过滤,四层过滤   注意   四层 采用 accept和reject    七层采用 allow和deny    ...

  5. 用到的设计模式总结--单例模式+工厂方法模式+Builder模式

    一,工厂方法模式和单例模式 工厂方法模式中有一个抽象的工厂接口和一个抽象的产品接口.然后,具体的工厂实现抽象工厂并负责生产具体的产品.由客户端决定 new 哪个具体的工厂,从而生产哪种产品. 因此,与 ...

  6. Mogodb 学习一

    0.MongoDB和关系型数据的几个重要对象对比 MongoDB中的数据库.集合.文档 类似于关系型数据库中的数据库.表.行 MongoDB中的集合是没有模式的,所以可以存储各种各样的文档 1.启动M ...

  7. 浅谈 JSON 那些被转义的字符们

    其实,之前我一直以为 JSON 会把 ASCII 可显示字符以外的统统转义为 Unicode,直到有一次我用 JSON.stringify 才发现,其实是 PHP 为我们想的太周到了. 我以前是一位 ...

  8. [整理]IE11中的WebGL探秘:渲染速度超Chrome

    http://www.csdn.net/article/2013-12-19/2817854-IE11-WebGL-and-more 摘要:IE11开始支持WebGL,并且效果非常好,IE11的Web ...

  9. 关于spring中Assert的应用(方法入参检测工具类)

    关于spring中Assert的应用(方法入参检测工具类) Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方 ...

  10. 一个无锁消息队列引发的血案(四)——月:RingQueue(上) 自旋锁

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...