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

実用 Picture in Picture

実用 Picture in Picture

aosa4054

June 18, 2019
Tweet

More Decks by aosa4054

Other Decks in Programming

Transcript

  1. 実⽤ Picture in Picture
    2019.06.18
    Shota Ara
    Mirrativ, Inc.
    © 2019 Mirrativ, Inc.
    potatotips #62

    View full-size slide

  2. 99
    ⾃⼰紹介

    View full-size slide

  3. Shota Ara
    • Internship @Mirrativ
    • Android app dev
    • Twitter: aosa4054(あおさ)
    • GitHub: aosa4054

    View full-size slide

  4. 99
    Picture in Pictureとはなんぞや

    View full-size slide

  5. 動画です!

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. 99
    どうやるのか

    View full-size slide

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

    View full-size slide

  11. PictureInPictureParams.Builder

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  20. Picture in Pictureのタスクとライフサイクル
    onPictureInPictureModeChanged(true)
    onResume
    onPictureInPictureModeChanged(false)
    return dismiss
    onPause
    onStop
    onDestroyは呼ばれずに
    タスクも残り続ける

    View full-size slide

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

    View full-size slide

  22. onPictureInPictureModeChanged(true)
    onStop
    onResume
    onPictureInPictureModeChanged(false)
    Activity. isInPictureInPictureMode = true
    onPause

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  26. 99
    めんどい

    View full-size slide

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

    View full-size slide

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

    View full-size slide