21
static変数さんと Activityさん Androidstatic変数を使うと。。。

[Android]Static変数さんとactivityさん

Embed Size (px)

DESCRIPTION

Androidでstatic変数を使っていて、「あれ、いつの間にか値がnullになっている?」みたいなのに遭遇したこと、ありませんか? このスライドでは、そのような状況がどんな仕組みで発生するかと、開発時の再現方法を紹介します。

Citation preview

Page 1: [Android]Static変数さんとactivityさん

static変数さんとActivityさん

Androidでstatic変数を使うと。。。

Page 2: [Android]Static変数さんとactivityさん

● static変数さん○ publicだとクラスを知ってる人なら誰でもアクセスでき

るよ○ singletonで使う人もいるよね○ プロセスが止まると中身無くなるよ

● Activityさん○ アプリの基本要素だよ○ ライフサイクルがあるよ○ インスタンスは状況によって破棄されるよ

登場人物

Page 3: [Android]Static変数さんとactivityさん

サービスのアクセストークンをアプリの起動中、保存したい

static変数さんを使いたくなる時

ログイン後、

SharedPreferencesに保存して、

static変数にアクセストークンをセット

そして次のActivity/Fragmentに遷移

Page 4: [Android]Static変数さんとactivityさん

static変数に値をセットするのは

最初のActivityのみ

つまり。。。

(毎回SharedPreferencesから読むのなら、

そもそもstatic変数に値セット、しないよね)

Page 5: [Android]Static変数さんとactivityさん

アプリの起動中、保存したい

アプリの起動中、保存したい

アプリの起動中、保存したい

で、いつ使うんだっけ?

Page 6: [Android]Static変数さんとactivityさん

プロセスが生きている間のことだよね?

アプリの起動中って

それ、ホントか?

Page 7: [Android]Static変数さんとactivityさん

onCreate()↓

onStart()↓

onResume()↓

Activityのライフサイクル

onPause()↓

onStop()↓

onDestroy()

(http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)

Page 8: [Android]Static変数さんとactivityさん

● onPause()が呼ばれる● アプリの実行は中断される● アプリの実行は中断される● アプリの実行は中断される

ホームボタンを押すとどうなる?

Page 9: [Android]Static変数さんとactivityさん

システムリソース(メモリなど)が足りなくなると、Activityインスタンスが破棄される

状況によっては、

プロセスも止まる

Activityがバックグラウンドにいる

Page 10: [Android]Static変数さんとactivityさん

後で復元するために、

onSaveInstanceState()が実行される

退避したBundleはonCreate()などで

引数として復元用に渡される

Activityインスタンスの破棄

Page 11: [Android]Static変数さんとactivityさん

static変数さんの中身は無くなる

プロセスが止められると

(さよならstatic変数さん)

Page 12: [Android]Static変数さんとactivityさん

アプリ切り替えで再開

Page 13: [Android]Static変数さんとactivityさん

onCreate()の引数に、退避させたインスタンスの情報が入ってる

復元可能!

(というか復元してくださいおねがいします)

Activityが破棄されていたら?

Page 14: [Android]Static変数さんとactivityさん

アプリ最初から起動しなおし?

プロセスが殺されてたら?

(まさかね。。。)

Page 15: [Android]Static変数さんとactivityさん

1. プロセスをもう一度立ち上げる2. Activityの復元を行う3. ホームボタンを押した時点に戻る(ちゃんと

作っていれば)

現実は。。。

最初からじゃない!

Page 16: [Android]Static変数さんとactivityさん

設計では、ログイン用Activityでのみセットだったよね?

途中から再度プロセスが起動すると、セットするタイミングは?

static変数さんの中身は?

Page 17: [Android]Static変数さんとactivityさん

でも、実際にプロセスまで殺されるケースって、再現難しくない?

Activityであれば、開発者オプションにあるけど。。。

消えるケースがあるのはわかった

Page 18: [Android]Static変数さんとactivityさん

DDMSで止めれます

開発中アプリのプロセスを選んで

真ん中のSTOPボタン

(画像つぶれててすいません。。)

Page 19: [Android]Static変数さんとactivityさん

再現手順のまとめ

1. static変数に値をセットする2. 次のActivityに遷移する3. ホームボタンを押してアプリ中断4. DDMSでプロセスを止める5. アプリ切り替えでアプリ再開6. static変数の値を使う処理を行う

static変数さんを空にしてみよう

Page 20: [Android]Static変数さんとactivityさん

アプリ起動中にstatic変数の中身が空になる

ケースはありますメモリキャッシュのような、消えてもあまり困らないものを入れる程度にしておいたほうが吉(と、fkmさんは感じてる)

ということで

Page 21: [Android]Static変数さんとactivityさん

static変数さんとActivityさん

完?著 @fkm