Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

99 ⾃⼰紹介

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

99 Picture in Pictureとはなんぞや

Slide 5

Slide 5 text

動画です!

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

99 どうやるのか

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

PictureInPictureParams.Builder

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

99 めんどい

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

99 PR

Slide 29

Slide 29 text

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