Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実用 Picture in Picture

実用 Picture in Picture

62384887995a0ce07ec4f86b89f5ec9e?s=128

aosa4054

June 18, 2019
Tweet

Transcript

  1. 実⽤ Picture in Picture 2019.06.18 Shota Ara Mirrativ, Inc. ©

    2019 Mirrativ, Inc. potatotips #62
  2. 99 ⾃⼰紹介

  3. Shota Ara • Internship @Mirrativ • Android app dev •

    Twitter: aosa4054(あおさ) • GitHub: aosa4054
  4. 99 Picture in Pictureとはなんぞや

  5. 動画です!

  6. 端末の設定に⾶ぶ 閉じる 拡⼤して元の画⾯に戻る RemoteAction(複数設定可) Picture in Picture画⾯の詳細

  7. • 画⾯に⼩さいウインドウを出せる • 別のアプリを使いながらでも あるアプリを⾒続けられる • PIP中は限定された動作しかできない

  8. • Android O以上 • Android TVのみNougatからでも使える • パーミッションを取る必要なし • 設定からユーザーが無効にすることができる

  9. 99 どうやるのか

  10. enterPictureInPictureMode(PictureInPictureParams.Builder().build())

  11. PictureInPictureParams.Builder

  12. PictureInPictureParams.Builder Rational型の引数を渡して PIP画⾯の縦横⽐を指定できる

  13. PictureInPictureParams.Builder IconとPendingIntentを含むRemoteActionを渡して PIP画⾯におけるアクションを設定できる。

  14. PictureInPictureParams.Builder IconとPendingIntentを含むRemoteActionを渡して PIP画⾯におけるアクションを設定できる。 BroadCastReceiverで 購読すれば処理が可能

  15. PictureInPictureParams.Builder 左右上下どの辺に寄りやすいか を指定できる

  16. 99 タスクとライフサイクル

  17. 通常のタスクとライフサイクル onCreate onStart onResume onPause onStop onDestroy 同⼀のタスクで⾏われる

  18. Picture in Pictureのタスクとライフサイクル 当該Activityのみ別タスクへ enterPictureInPictureMode(PictureInPictureParams.Builder().build()) onPictureInPictureModeChanged onPictureInPicturModeChanged(isInPictureInPictureMode: Boolean)

  19. Picture in Pictureのタスクとライフサイクル onPictureInPictureModeChanged(true) onStop onResume onPictureInPictureModeChanged(false) return dismiss onPause

  20. Picture in Pictureのタスクとライフサイクル onPictureInPictureModeChanged(true) onResume onPictureInPictureModeChanged(false) return dismiss onPause onStop

    onDestroyは呼ばれずに タスクも残り続ける
  21. • ユーザーからすると 「消したはずのアプリがタスクに残り続けてる、、なんで?」 「同じアプリがタスクに⼆つあるんだけど、、」 となる • 復帰時とDismiss時で別々の処理を⾏えない • Activity. isInPictureInPictureModeというフラグはあるが

    これではタイミングの問題でハンドリングできない なにが問題か
  22. onPictureInPictureModeChanged(true) onStop onResume onPictureInPictureModeChanged(false) Activity. isInPictureInPictureMode = true onPause

  23. なにが問題か • ユーザーからすると 「消したはずのアプリがタスクに残り続けてる、、なんで?」 「同じアプリがタスクに⼆つあるんだけど、、」 となる • 復帰時とDismiss時で別々の処理を⾏えない • 別にフラグを作って管理するしかない

  24. onPictureInPictureModeChanged(true) onPictureInPictureModeChanged(false) こっちのタイミングでフラグを 管理することでonResume, onStop内で 復帰時とdismiss時で別々の処理をできる onResume onStop onPause

  25. onPictureInPictureModeChanged(true) onPictureInPictureModeChanged(false) こっちのタイミングでフラグを 管理することでonResume, onStop内で 復帰時とdismiss時で別々の処理をできる onResume onPause onStop if(fromPictureInPicture)

    finishAndRemoveTask() とか……
  26. 99 めんどい

  27. 99 フラグ管理をいい感じにするライブラリを作りました https://github.com/aosa4054/ PictureInPictureLifecycleObserver

  28. 99 PR

  29. https://www.mirrativ.co.jp/recruit/