Upload
hirokazu-fukami
View
9.662
Download
0
Embed Size (px)
DESCRIPTION
Androidでstatic変数を使っていて、「あれ、いつの間にか値がnullになっている?」みたいなのに遭遇したこと、ありませんか? このスライドでは、そのような状況がどんな仕組みで発生するかと、開発時の再現方法を紹介します。
Citation preview
static変数さんとActivityさん
Androidでstatic変数を使うと。。。
● static変数さん○ publicだとクラスを知ってる人なら誰でもアクセスでき
るよ○ singletonで使う人もいるよね○ プロセスが止まると中身無くなるよ
● Activityさん○ アプリの基本要素だよ○ ライフサイクルがあるよ○ インスタンスは状況によって破棄されるよ
登場人物
サービスのアクセストークンをアプリの起動中、保存したい
static変数さんを使いたくなる時
ログイン後、
SharedPreferencesに保存して、
static変数にアクセストークンをセット
そして次のActivity/Fragmentに遷移
static変数に値をセットするのは
最初のActivityのみ
つまり。。。
(毎回SharedPreferencesから読むのなら、
そもそもstatic変数に値セット、しないよね)
アプリの起動中、保存したい
アプリの起動中、保存したい
アプリの起動中、保存したい
で、いつ使うんだっけ?
プロセスが生きている間のことだよね?
アプリの起動中って
それ、ホントか?
onCreate()↓
onStart()↓
onResume()↓
Activityのライフサイクル
onPause()↓
onStop()↓
onDestroy()
(http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle)
● onPause()が呼ばれる● アプリの実行は中断される● アプリの実行は中断される● アプリの実行は中断される
ホームボタンを押すとどうなる?
システムリソース(メモリなど)が足りなくなると、Activityインスタンスが破棄される
状況によっては、
プロセスも止まる
Activityがバックグラウンドにいる
後で復元するために、
onSaveInstanceState()が実行される
退避したBundleはonCreate()などで
引数として復元用に渡される
Activityインスタンスの破棄
static変数さんの中身は無くなる
プロセスが止められると
(さよならstatic変数さん)
アプリ切り替えで再開
onCreate()の引数に、退避させたインスタンスの情報が入ってる
復元可能!
(というか復元してくださいおねがいします)
Activityが破棄されていたら?
アプリ最初から起動しなおし?
プロセスが殺されてたら?
(まさかね。。。)
1. プロセスをもう一度立ち上げる2. Activityの復元を行う3. ホームボタンを押した時点に戻る(ちゃんと
作っていれば)
現実は。。。
最初からじゃない!
設計では、ログイン用Activityでのみセットだったよね?
途中から再度プロセスが起動すると、セットするタイミングは?
static変数さんの中身は?
でも、実際にプロセスまで殺されるケースって、再現難しくない?
Activityであれば、開発者オプションにあるけど。。。
消えるケースがあるのはわかった
DDMSで止めれます
開発中アプリのプロセスを選んで
真ん中のSTOPボタン
(画像つぶれててすいません。。)
再現手順のまとめ
1. static変数に値をセットする2. 次のActivityに遷移する3. ホームボタンを押してアプリ中断4. DDMSでプロセスを止める5. アプリ切り替えでアプリ再開6. static変数の値を使う処理を行う
static変数さんを空にしてみよう
アプリ起動中にstatic変数の中身が空になる
ケースはありますメモリキャッシュのような、消えてもあまり困らないものを入れる程度にしておいたほうが吉(と、fkmさんは感じてる)
ということで