実用 Picture in Picture
by
aosa4054
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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/