YouTube

Got a YouTube account?

New: enable viewer-created translations and captions on your YouTube channel!

Chinese, Simplified subtitles

← App Lifecycle and Services - Developing Android Apps

Get Embed Code
10 Languages

Showing Revision 14 created 07/04/2016 by Udacity Robot.

  1. 在第四课中 我们学习了 Android 运行时
  2. 会终止没有可见 activity 的应用
  3. 来释放资源以满足前台运行应用的需要
  4. 但如果应用需要在 activity 不可见时
  5. 继续运行任务该怎么办?
  6. 比如说下载文件、上传照片或播放音乐
  7. 有一个程序组件就可以专门解决此问题
  8. 那就是服务
  9. 我们已经介绍了 activity、内容提供器、
  10. 广播接收器和 intent
  11. 服务就是 Android 应用组件拼图中的最后一片
  12. 启动服务的方法与 activity 类似
  13. 就是将 intent 传递给 startService 调用
  14. 你也可以用同样的方式停止服务
  15. 只要调用 stopService 然后传入
  16. 你想要结束的服务名
  17. 与 activity 不同 服务没有用户界面
  18. 并且比后台 activity 的优先级更高
  19. 这就意味着正在运行服务的应用
  20. 不太可能因为要给前台运行的 activity
  21. 释放资源而被运行时终止
  22. 事实上 在默认情况下 系统会试图重启
  23. 那些在应用内暂停之前就被终止了的服务
  24. 这都反映在这个简化的生命周期图中
  25. 与 activity 相比 服务旨在用于
  26. 执行那些运行时间更长且不应被中断的任务
  27. 一般来说 你只需要重写 onStartCommad 处理程序
  28. 如此来开始你希望执行的
  29. 后台任务
  30. 不过要注意的是 没有能够用于监控状态变化的处理程序
  31. 以反映移到后台的应用
  32. 这是因为运行中的服务本身
  33. 会向框架发送信号
  34. 告诉它所包含的应用应该比没有
  35. 正在运行服务的其它后台应用的优先级更高
  36. 在某些情况下 你的服务可能在执行一项
  37. 没有 UI 的任务 无法在不干扰
  38. 用户体验的情况下被中断
  39. 比如说 播放音乐或使用车载导航
  40. 在这些案例中 你可以调用 startForeground
  41. 以此来表明你的服务
  42. 应该在前台运行
  43. 你会发现 这个调用收到一个通知
  44. 通知会显示出来 并且在服务停止或
  45. 在你调用 stopForeground 前 都无法被解除
  46. 大家稍后会与 Dan 一道学习更多有关通知的知识
  47. 但现在只要知道前台服务运行时的优先级
  48. 与前台 activity 的优先级相同即可
  49. 这样 运行时就难以终止应用
  50. 以释放资源了
  51. 你可能在想 如果我可以创建长时间运行的服务
  52. 甚至前台服务 就能避免
  53. 应用生命周期带来的许多麻烦
  54. 我在澳大利亚的海滨长大
  55. 在很小的时候就知道 逆着水流游泳会让你精疲力竭
  56. 甚至徒劳无功
  57. 在这个案例中 也就是说 如果这样做
  58. 会使系统难以管理资源
  59. 最后会导致获得很糟糕的用户体验
  60. 游泳时应该顺着水流
  61. 只有在绝对需要时
  62. 才使用前台服务
  63. 并且一但可能就尽快停止所有服务
  64. 另一个需要着重注意的地方就是与 activity 和接收器一样
  65. 服务是在主线程上运行的
  66. 所以 你需要使用后台线程或思考任务
  67. 来执行你想用服务完成的长时间运行任务
  68. 有一条捷径 你可以使用 intent 服务类
  69. 它可实施对使用 intent 来说最普遍的最佳方案模式
  70. 这是在服务之内执行的
  71. 它为传入的 intent 创建一个队列 调用 startService 时就把它们传进来
  72. 然后 这些 intent 就会按顺序在后台线程中
  73. 被 onHandleIntent 处理程序和 intent 服务实现程序处理掉
  74. 队列为空时 服务会自我终止
  75. 直到收到新的 intent 再开始处理
  76. 服务是一个强大的工具 学会如何使用
  77. 服务很重要
  78. 不过在实际运用中 通常有一个替代框架
  79. 来运行你自己的服务实现
  80. 可能是一个执行后台任务的 intent 服务
  81. 或是你在本课稍后会学到的同步适配器
  82. 它是执行后台数据同步的好帮手