YouTube

Got a YouTube account?

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

Japanese subtitles

← 08-03 App Lifecycle and Services

Get Embed Code
10 Languages

Showing Revision 3 created 04/26/2015 by Udacity.

  1. レッスン4では
  2. フォアグラウンドアプリが
    リソースを開放するために
  3. 見えるActivityがない時に Android Runtimeが
    アプリを終了することを学びました
  4. しかしアプリに ファイルや写真のアップロードや
    音楽の再生のような
  5. Activityが見えない時にも継続する必要のある
  6. タスクがある場合はどうでしょう?
  7. そのためのアプリケーションコンポーネントが
    Serviceです
  8. すでにActivity、コンテンツプロバイダ、
  9. BroadcastReceiver、インテントを導入しました
  10. ServiceはAndroidアプリケーション
    コンポーネントのパズルの最後のピースです
  11. インテントをstartService呼び出しに渡すことで
  12. ServiceをActivityと同じように開始します
  13. また停止したいService名を
    stopService呼び出しに渡すことで
  14. 同様にServiceを止められます
  15. ServiceにはUIがなく
  16. バックグラウンドのActivityより
    高い優先順位で実行されます
  17. フォアグラウンドのActivityが使う
    リソースを開放するために
  18. Service実行中のアプリが停止させられる
    可能性が低いのです
  19. 実際にはデフォルトのシステムは
  20. アプリ内からServiceを止める前に
    終了させられたServiceを再開しようとし
  21. この単純化されたライフサイクルに
    反映されます
  22. Activityと比べると Serviceは
  23. 中断すべきではない長時間のタスクを
    実行するために設計されています
  24. 基本的には バックグラウンドタスクを始める
    onStartCommandハンドラを
  25. オーバーライドする必要があるだけです
  26. しかしアプリのバックグラウンドへの移動を
    反映するような
  27. 状態の変化を監視するハンドラがない点に
    注目してください
  28. これは実行中のServiceが
    フレームワークへ次のように通知するからです
  29. “このアプリはバックグラウンドにあり
    実行中のServiceを持たない他のアプリより”
  30. “優先度が高い”
  31. Serviceはタスクを実行するかもしれません
  32. このタスクはUIを持たないので
    中断の際にユーザ体験を妨げてしまいます
  33. 例えば音楽の再生や
    カーナビのサポートなどです
  34. こういった場合 startForeground
    呼び出しによって
  35. Serviceがフォアグラウンドで
    実行されているとするべき と通知できます
  36. またこの呼び出しが
    Notificationを含みます
  37. これは画面に表示されて
  38. Serviceが止まるかstopForegroundが
    呼び出されるまで閉じません
  39. あとでダンと一緒に
    Notificationについて学びます
  40. しかし今は フォアグラウンドのServiceが
  41. フォアグラウンドのActivityと同じ優先順位で
    実行される点に注意してください
  42. これでRuntimeがリソースを開放するために
    Serviceを停止することはほぼ不可能となります
  43. 皆さんも考えているかもしれませんが
  44. 長時間のServiceや
    フォアグラウンドのServiceを作成することで
  45. ライフサイクルを扱う際のトラブルを
    かなり回避できます
  46. 私はオーストラリアの海岸沿いで育ったので
  47. 潮の流れに逆らうとひどく疲れて
    結局無駄だということを子供の頃に学びました
  48. この場合システムがリソースを管理して
  49. 最終的に価値のあるユーザ体験をもたらすのは
  50. より困難になることを意味します
    流れに身を任せましょう
  51. フォアグラウンドのServiceは
    絶対に必要な時にだけ使いましょう
  52. またすべてのServiceを
    できるだけ速やかに止めましょう
  53. ActivityやReceiverなどのように
  54. Serviceもメインスレッドで
    実行される点も重要です
  55. Service内で長時間のタスクを実行するためには
  56. バックグラウンドスレッドや
    AsyncTaskを使う必要があります
  57. 簡単にするために
    IntentServiceクラスが使えます
  58. これはインテントを使うために
    Service内で実行される
  59. 最も一般的で最良のパターンを実装します
  60. インテントのキューも作成し
    startServiceの呼び出しの時にこれを渡します
  61. そしてキューはIntentServiceの実装にある
    onHandleIntentハンドラ内で
  62. バックグラウンドスレッドで
    連続して処理されます
  63. キューが空の時
    Serviceは新たなインテントを受信して
  64. プロセスが再開するまでの間
    自らを終了させます
  65. Serviceは強力なツールなので
    使い方を理解することは重要です
  66. しかし実際には皆さんのServiceの実装に対する
    代替的なフレームワークがあります
  67. バックグラウンドタスクを実行するための
    IntentServiceか
  68. このレッスンのあとの方で学ぶSyncAdapterです
  69. これはバックグラウンドのデータ同期に最適です