手记

【九月打卡】第2天 Android 中 Service 和线程的区别和使用场景

课程名称BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师DocMike

课程内容

Android 中的 Service

Android 中的主线程要完成 UI 界面的绘制和点击事件的响应等,所以不能做一些耗时的操作,而 Service就是运行在主线程中的。 Android 系统仅会为 Service 创建一个实例,不能在 Service 中做耗时操作,会引起 ANR。如果想在 Service 中执行耗时操作,可以使用 IntentService。在 IntentService 中,会开启一个子线程来执行耗时操作,执行完毕后就会停止。

Service 和应用程序运行在一个进程中,这个进程通常会用应用的包名作为标识。启动 Service 有两种方式:通过调用 startService() 开启服务和通过调用 bindService() 绑定服务。两种方式启动 Service 的生命周期的回调方法不同。通过 startService() 开启:onCreate()->onStartCommand()->onDestory(),通过 bindService 绑定:onCreate()->onBind()->onUnbind()->onDestory()。

注意:Service 的 onCreate() 方法只会被调用一次。 无论多少次的 startService() 和 bindService(),Service 只被创建一次。

  • 如果是先 bindService(),那么 startService() 的时候就直接运行 onStartCommand() 方法;
  • 如果是先 startService(),那么 bindService() 的时候就直接运行 onBind() 方法;
  • 如果是先 bindService(),那么 Service 就 stop 不掉了,只能先 unbindService(), 再 stopService(),所以是先 startService(),还是先 bindService() 是有区别的。

那么,什么情况下既使用 startService(),又使用 bindService() 呢?
如果只是想要启动一个后台服务长期进行某项任务,那么使用 startService() 便可以了。如果你还想要与正在运行的Service 取得联系,那么有两种方法:一种是使用 broadcast ,另一种是使用 bindService()。 前者的缺点是如果交流较为频繁,容易造成性能上的问题,而后者则没有这些问题。因此,这种情况就需要 startService() 和bindService() 一起使用了。

另外,如果服务只是公开一个远程接口,供连接上的客户端(Android的Service是C/S架构)远程调用执行方法,这个时候你可以不让服务一开始就运行,而只是 bindService(),这样在第一次 bindService() 的时候才会创建服务的实例运行它,这会节约很多系统资源,特别是如果你的服务是远程服务,那么效果会更明显。

线程 Thread

线程是程序执行的最小单元,是分配 cpu 资源的最小单位。Thread 的完整生命周期包括:新建、就绪、运行、死亡和阻塞 5 个状态。

  1. 新建状态,线程创建之后,不会立即进入就绪状态,因为线程的运行需要一些条件(比如内存资源,譬如程序计数器、Java栈、本地方法栈都是线程私有的,所以需要为线程分配一定的内存空间),只有线程运行需要的所有条件满足了,才进入就绪状态。

  2. 就绪状态,当线程进入就绪状态后,不代表立刻就能获取 CPU 执行时间,也许此时 CPU 正在执行其他的事情,因此它要等待。当得到 CPU 执行时间之后,线程才真正进入运行状态。

  3. 运行状态,线程在运行状态过程中,可能有多个原因导致当前线程不继续运行下去,比如用户主动让线程睡眠(睡眠一定的时间之后再重新执行)、用户主动让线程等待,或者被同步块给阻塞。

  4. 阻塞状态, 线程在阻塞状态时,让出 CPU 并暂停自己,等待下次获取 CPU 的执行时间。

  5. 死亡状态,当由于突然中断或者子任务执行完毕,线程就会被消亡。

Service 与 Thread 的区别

  1. Service 和 Thread 都可以后台执行,没有界面;
  2. Servcie 是运行在主进程中的,不能执行耗时操作,Thread 可以做耗时操作;
  3. Service轻量级进程间通信,载体是 Binder。Thread 独立于 Activity,Activity 被 finish 后,就不在持有该 Thread,也就无法控制和监听该 Thread 的状态。

课程总结

这一节详细介绍了 Service 的生命周期,以及通过 startService() 和 bindService() 两种方式开起 Service 时,生命周期回调的区别。通过 Service 和 Thread 适用场景的对比,更能加深对 Service 的理解。

0人推荐
随时随地看视频
慕课网APP