转自:http://www.mythroad.net/2012/12/20/%E3%80%90android%E3%80%91thread%E4%B8%8Eservice%E7%9A%84%E5%B7%AE%E5%BC%82/


刚学习android的朋友看到service的时候肯定会一伙java语言已经提供了后台处理任务的机制,Thread,为什么VM层面还要提供一种service这样的概念呢,两者的差异到底在哪里,google的设计意图何在?请看本文分解

1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。

2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是RemoteService,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!

既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread或者 Thread 里的run 方法没有执行完毕的话,Thread也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。

停止了服务,会停止服务里面的线程吗?

经过测试,不会。如果是循环线程,依然是通过在服务销毁的方法里面onDestroy()设置标记变量

killProcess会停止服务吗

不会

更多相关文章

  1. android component包含的内容
  2. Android四大组件之 BroadcastReceiver
  3. Android配置QQ邮箱问题
  4. 浅谈Android(安卓)ANR在线监控原理
  5. Android技术周报190310期 —— onSaveInstanceState到底做了些什
  6. 如何避免android ANR
  7. Android应用程序管理
  8. Android(安卓)UI界面刷新与交互
  9. 桌面小控件(Widget)--之清理进程

随机推荐

  1. android如何调用显示和隐藏系统默认的输
  2. Android(安卓)手动显示和隐藏软键盘 andr
  3. Android编程示例之——横竖屏切换动画
  4. Gradle for Android(安卓)脚本编写总结
  5. Ubuntu搭建Eclipse+JDK+SDK的Android
  6. Android(安卓)调用相册 拍照 实现系统控
  7. android sdk安装与配置(转)
  8. Android(安卓)tips2
  9. Android单选框(RadioButton)
  10. 自己实现android的日志框架