いまさら聞けない activityやfragment - android …...•androidアプリを開発したり...

112
いまさら聞けない ActivityやFragment おはなし Android Bazaar and Conference 2016 Autumn

Upload: others

Post on 11-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

いまさら聞けない ActivityやFragment

の おはなし

Android Bazaar and Conference 2016 Autumn

Page 2: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

• Androidアプリを開発したり

• iOSアプリを開発したり

• Webアプリ(TypeScript)を開発したり

• 技術情報を発信したり

★ Twitter @mokelab

★ https://tech.mokelab.com

Page 3: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

グッズあるよ!

Page 4: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

クイズを 16問用意しました

全問正解できたら。。。

Page 5: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

何もありません

Page 6: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activity

Page 7: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activity

• コンポーネントの1つだよ

• UIを提供するよ

• ライフサイクルがあるよ

Page 8: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

コンポーネント

Page 9: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問1

Androidには、何種類のコンポーネントが ありますか?

Page 10: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答1•4種類

✦ Activity

✦ Service

✦ BroadcastReceiver

✦ ContentProvider

Page 11: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

コンポーネントとは システムが必要に応じて オブジェクトを作って 仕事させるもの

Page 12: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activityの ライフサイクル

Page 13: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

ライフサイクル

※http://yubin-nenga.jp/products/plane.html

Page 14: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Javaオブジェクトの ライフサイクル

public void moke() { // 誕生 Date d = new Date();

// 誰からも参照されなくなったら // 破棄される }

Page 15: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問2

Activityのライフサイクルメソッドを全部言えますか?

Page 16: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答2• onCreate()

• onRestart()

• onStart()

• onResume()

• onPause()

• onStop()

• onDestroy()

Page 17: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり
Page 18: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

ライフサイクルメソッドは なんとなくで

呼ばれているものではない!

Page 19: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onCreate()

• △ Activityが起動したとき

• ○ Activityオブジェクトが作られたとき

Page 20: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onRestart()

• Activityが停止後、もういちど開始するとき

• 一度停止していないと呼ばれない

Page 21: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問3

onStart()とonResume()の違いは何でしょうか?

Page 22: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onStart()

• Activityが表示されたタイミングでよばれる

• この時点では、ユーザーの操作は受け付けない

Page 23: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onResume()

• Activityがユーザーとの対話を始めたタイミングでよばれる

• ユーザーは、ボタンタップなどができる

Page 24: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onStart()は 呼ばれるが onResume()は 呼ばれない例

Page 25: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onPause()

• Activityがユーザーとの対話をとめるときによばれる

★別Activityを起動しようとした

★ダイアログを表示しようとした

Page 26: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onStop()

• Activityがみえなくなるタイミングでよばれる

★別Activityが(全画面で)表示された

★ホームボタンを押した

Page 27: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onDestroy()

• △ Activityが終了するときによばれる

• ○ Activityオブジェクトが破棄されるときに  よばれる

Page 28: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

• 上Activityがアクティブのとき下Activityをタップするとライフサイクルメソッドはどのように呼ばれますか?

問4

Page 29: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

• 下ActivityonResume()が呼ばれる

答4• 上ActivityonPause()がよばれる(onStop()はよばれない)

Page 30: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activityオブジェクトの ライフサイクルは これでだいじょうぶ

Page 31: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスク

Page 32: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問5

タスクとはユーザーにはどのように見えるか

説明できますか?

Page 33: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答5

アプリ!

Page 34: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスク

https://developer.android.com/guide/components/recents.html

Page 35: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクはスタック

一覧Activity

詳細Activity

Twitter投稿Activity

Page 36: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activityの起動起動する Activity

?

Page 37: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問6

Activityの起動モードは何種類ありますか?

Page 38: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答6•4種類 ★ Standard

★ SingleTop

★ SingleTask

★ SingleInstance

Page 39: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Standard

• 指定なしはこれで起動する

• Intentを受け取ったら、インスタンスを作る

• Intentを投げたActivityと同じタスクに入る

Page 40: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTop

• Intentを投げたActivityと同じタスクに入る

• ただし、自分自身に対してIntentを投げた場合は、新たにインスタンスを作らず、onNewIntent()が呼ばれるだけ

Page 41: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTask

• どれか1つのタスクにしか所属できない

• なので、インスタンスは1つしかできない

Page 42: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTask• ケース1 起動するActivityがどのタスクにもいない

新しくタスクを作り、フォアグラウンドにもってくる

Page 43: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTask• ケース2 起動するActivityがすでに別タスクにいる

図で説明するよ

Page 44: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTask1.該当Activityのいるタスクを  フォアグラウンドにする

Activity

Activity

ActivityActivity

Activity

フォアグラウンド

Page 45: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTask2. 該当Activityよりスタックで上にいるActivityを   全部終了させる!

Activity

Activity

ActivityActivity

Activity

フォアグラウンド

Page 46: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleTask3. 該当ActivityのonNewIntent()が呼ばれる

Activity

Activity

ActivityActivity

フォアグラウンド

Page 47: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

例:OAuthのコールバック

1. アプリActivityがブラウザに対してIntent投げる

2. ブラウザのタスクがフォアグラウンドになる

3. コールバックを契機に、アプリActivityに Intentが投げられる

4. アプリActivityのタスクがフォアグラウンドになる(新しくインスタンスは作られない)

Page 48: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

SingleInstance

• どれか1つのタスクにしか所属できない

• そのタスクに別Activityを含めることはできない

★ SingleTaskだと含めることができるよ

Page 49: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問7

Androidの標準アプリで SingleTaskが使われているのは

どれでしょうか?

Page 50: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答7カメラ!

Page 51: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答7• ホームでカメラアイコンをタップしたらすぐ撮影Activityが始まってほしい

• 編集Activityなどがあるので、上にActivityが のっかるのはOKにしたい

★編集を中断して、オーバービューから 再開はしたい

Page 52: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問8

Androidの標準アプリで SingleInstanceが使われているのは

どれでしょうか?

Page 53: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答8ブラウザ!

Page 54: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答8はSingleTaskでしたす、すいません。。。

Page 55: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答8ほんとの答えは通話中Activity

Page 56: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答8• 通話中Activityが他のActivityの上に乗っているとユーザーは通話中Activityに戻りにくくなる

★オーバービューではルートのアプリ名だから

• 通話中Activityの上に別のActivityが乗ってると いざ通話をやめたいときに、バックボタンの連打が必要になってしまう

Page 57: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問8おわび• 単なる動作ではSingleTaskとSingleInstanceの違いを見分けるのは困難でした。。。

• 通話ActivityがSingleInstanceかどうかは下記URLで確認できます(InCallActivity) https://android.googlesource.com/platform/packages/apps/Dialer/+/master/AndroidManifest.xml

Page 58: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクアフィニティ

Page 59: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問9

TaskAffinityということばを聞いたことありますか?

Page 60: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクアフィニティ• 「親和性」

• ホームでアプリのアイコンをタップしたときどういう動きをすべきか

★ FLAG_ACTIVITY_NEW_TASK

★新しいタスクを作り続けるわけにはいかない

Page 61: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクアフィニティタスクには名前がある=アフィニティ

Activity

Activity

ActivityActivity

Activity

タスクA タスクB タスクC

Page 62: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクアフィニティ• ホームでアプリアイコンをタップした

• 同じアフィニティなタスクがない場合

• タスクを作ってそれをフォアグラウンドにする

• 同じアフィニティなタスクがすでにある場合

• そのタスクをフォアグラウンドにする

Page 63: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問10

TaskAffinityはどんな時に指定すべきでしょうか?

Page 64: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答10

1つのapkにLAUNCHERなActivityが2つ以上ある場合!

デバッグ用Activityをいれている時に有効

Page 65: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクアフィニティを 設定する

<activity android:name=".EditActivity" android:taskAffinity="com.mokelab.app.debug"> <intent-filter> <action android:name="android.intent.action.EDIT"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>

Page 66: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクアフィニティを 設定する

ドット(.)が1つ以上ないとインストール時にエラー

Error installing split apks: com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl231441147.tmp/base.apk (at Binary XML file line #26): Invalid taskAffinity name com in package com.mokelab.affinitydemo: must have at least one '.' separator

Page 67: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問11

android:allowTaskReparenting=”true”は、どんな動きをするか理解していますか?

Page 68: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答11EditActivityにandroid:allowTaskReparenting=”true”をつけた (赤枠は同じAffinityを持つActivity)

Activity

Edit

ActivityActivity

Edit

フォアグラウンド

Page 69: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答11ホームでActivityのアイコンをタップする

Activity

Edit

ActivityActivity

Edit

フォアグラウンド

Page 70: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答11android:allowTaskReparenting=”true”がついたEditActivityが集合する

Activity

Edit

ActivityActivity

Edit

フォアグラウンド

Page 71: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答11そして、フォアグラウンドに移動

Activity Activity

Edit

Activity

Edit

フォアグラウンド

Page 72: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクと起動モードは もう大丈夫ですよね?

Page 73: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

ですよね?

Page 74: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activityの

ライフサイクル (再)

Page 75: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり
Page 76: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

タスクとActivity

Activity

Activity

ActivityActivity

Activity

フォアグラウンド

Page 77: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activityの状態

起動前 アクティブ

中断 終了

Page 78: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

中断中なActivity

Activity

Activity

ActivityActivity

Activity

フォアグラウンド Activity 中断状態

Page 79: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

中断中なActivity

Activity

Activity

ActivityActivity

Activity

フォアグラウンド Activity メモリ上にいない Activity

Activityオブジェクトは破棄されていることがある

Page 80: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

オブジェクトの 状態保存

• 中断状態の場合、オブジェクトが破棄されることがある

• アクティブに戻る時、オブジェクトを作り直す

• これをうまくやるのがonSaveInstanceState()

Page 81: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

プロセス

Page 82: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

プロセスとコンポーネント

Activity Activity Service

メインループ

Page 83: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

1プロセスで 複数アプリに存在

Activity

Edit

ActivityActivity

Edit

フォアグラウンド

Page 84: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

プロセス• 1プロセスで、複数のコンポーネントが動作する

• コンポーネント(Activity)は、複数タスク内に存在することがある

• static変数は、プロセス単位で保持される変数

★ static変数で状態を持ったりすると。。。

Page 85: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

プロセス

いつ停止させられるか予測不能!

Page 86: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

プロセス

停止前に状態保存処理は書けない!

Page 87: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問12

static変数にアクセストークンを保持しているアプリを

クラッシュさせるには、どうすればよいですか?

Page 88: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答12

Page 89: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Activityまとめ

• Activityオブジェクトのライフサイクルメソッドの呼ばれるタイミングを学んだよ

• タスクと起動モードについて学んだよ

• プロセスとタスクの関係について学んだよ

Page 90: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Fragment

Page 91: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

主要人物

• Fragment

• FragmentManager

• バックスタック

Page 92: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Fragment

• レイアウトに貼って使うよ

★なので、使い回ししやすいよ

• 独自のレイアウトを持ってるよ

• 独自のライフサイクルがあるよ

Page 93: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

FragmentManager• Fragmentを管理する人だよ

• Fragmentのはりかえなどをやるよ

• ActivityやFragmentが持ってるよ

★ FragmentのgetFragmentManager()は親のFragmentManagerを取ってくるよ

Page 94: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

バックスタック

• Fragmentのはりかえ時に、状態をスタックに積めるよ

• バックボタンで、1つ前の状態(=画面)に戻れるようにするしくみ

Page 95: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問13

Fragmentはandroid.app.Fragmentとサポートライブラリ版の

どちらを使うべきでしょうか?

Page 96: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答13

サポートライブラリ版!

Page 97: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Fragmentの ライフサイクル

Page 98: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

ライフサイクル

• 基本はActivityと同じ

• 見えなくなったら(onStop()が呼ばれたら)Viewだけ先に捨てる

Page 99: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onCreateView()

• このFragmentが提供するViewを作ってほしいときに呼ばれるメソッド

• Viewを作ってreturnしよう

Page 100: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問14

親Activityが ユーザー情報を保持していますこのユーザー情報をFragmentで取得してよいタイミングはいつでしょうか?

Page 101: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答14

onActivityCreated()

Page 102: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onActivityCreated()• 親となるActivityがちゃんとつくられた後に よばれるメソッド

★ onCreate()やonCreateView()の時点ではちゃんと作られていないことがある

• 親Activityから情報をとりたいときはこのメソッド内でとる

Page 103: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

onDestroyView()

• このFragmentが提供するViewを破棄するタイミングでよばれる

• フィールドにViewをセットしている場合はnullをいれてちゃんと破棄されるようにしましょう

★特にButterKnife

Page 104: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

引数のある Fragment

Page 105: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問15

Activityでは、起動するためのIntentに引数データがセットできました

これと同様なことをFragmentで実現するにはどうすればよいでしょうか?

Page 106: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答15

setArguments()

※setterはアンチパターン

Page 107: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

実行結果のある Fragment

Page 108: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

問16

Activityでは、次Activityの実行結果をonActivityResult()で受け取れました

これと同様なことをFragmentで実現するには

どのようにすればいいでしょうか?

Page 109: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

答16

1. setTargetFragment()で、呼び出し元Fragment とリクエストコードをセット

2. getTargetFragment()で取り出して、 onActivityResult()を呼ぶ

※コールバックオブジェクトを渡すのはアンチパターン

Page 110: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

Fragmentまとめ

• Fragmentがどのようなものか学んだよ

• 引数つきFragmentのつくりかたを学んだよ

• 呼び出し元に結果を伝える方法を学んだよ

Page 111: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

ようやく アプリ開発の

スタートラインに立てた!

Page 112: いまさら聞けない ActivityやFragment - Android …...•Androidアプリを開発したり • iOSアプリを開発したり • Webアプリ(TypeScript)を開発したり

クラッシュするアプリが 減りますように