ねむい
本題
ライフサイクルのコールバックをActivity/Fragment以外のクラスで受け取りたいって話。
あると何がいいか
こんなふうなセンサーの値をとるクラスがあったとして、
MainActivity.kt
あたりで使うとして、こうですね
これの何が問題なのか
(activityじゃなくてcontextで良いだろ)
onPause()
に書き忘れる可能性がある
GetSensor
クラスで登録とか解除とかを自動でやってほしい
- なんでActivityの
onPause
とかに書かないといけないの?
ライフサイクル対応コンポーネント を利用して解決
これを使うと、
DESTROY
状態になったら呼ばれる関数(べつにSTARTでも良いよ)
- ActivityやFragmentのonPause()関数等がActivity/Fragment以外(自作クラス)でも利用できる!!!
ライフサイクルはクソなので助かる
なので書き直すと
LifecycleObserverを継承
LifecycleObserver
は実は中身空っぽなので書き足すだけでいいです
addObserver()
GetSensor
クラスのコンストラクタの引数にlifecycle: Lifecycle
を付け足します。
そしてinit{ }
の中に以下の1行を足します
ライフサイクルに関係している関数に@OnLifecycleEvent
をつける
まず忘れそうなdestroy()
関数につけましょう。
ちゃんとコメントも書き換えて、privateにしてしまいましょう(勝手に呼ばれるのでもう書く必要がないため)。
それとセンサーを登録する関数も、ライフサイクルがResume
の状態になったら自動で呼ぶようにします
最後にMainActivity
を修正して終わりです!
わあ!すごいスッキリ
実行してLogcatを出してアプリを離れると勝手に出力が終了し、また戻ってくると出力が始まってることが分かるはずです。
全部くっつけたコード
GetSensor.kt
MainActivity.kt
参考にしました
https://developer.android.com/topic/libraries/architecture/lifecycle?hl=ja