// ライフサイクルに応じた処理を行うクラス
class FooPresenter : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() { /* 開始処理 */ }
}
// Activity の onCreate メソッド内などで登録
lifecycle.addObserver(FooPresenter())
昔似たようなライブラリを作ってた : github:nobuoka/CallbacksAppComponents
ライフサイクル以外のコールバックも扱える仕組みを用意すると便利 (onActivityResult
とか)
ProcessLifecycleOwner
!ON_DESTROY
はないON_PAUSE
と ON_STOP
のイベントには遅れがあるonSaveInstanceState()
メソッドはいらん子や!Retain Fragment では onSaveInstanceState
を使えるんやけど……
onSaveInstanceState
とローカルストレージへの保存と ViewModel を組み合わせていい感じに』銀の弾丸ではない
When a binding uses a scope annotation, that means that the component object holds a reference to the bound object until the component object itself is garbage-collected. In memory-sensitive environments such as Android, you may want to let scoped objects that are not currently being used be deleted during garbage collection when the application is under memory pressure.
@CanReleaseReferences
アノテーションを付けて制御アプリケーションのコールバックを登録して空きメモリ容量低下時に参照を解放する。
class App : Application() {
override fun onCreate() {
super.onCreate()
// ReleasableReferenceManager を取得して、
val m = component.myReleasableReferenceManager()
// アプリケーションのコールバックを登録。
registerComponentCallbacks(MemoryLowCallback(m))
registerActivityLifecycleCallbacks(MemoryHighCallback(m))
}
}
/** メモリを使っていい状況になったら呼ばれるクラス。 */
private class MemoryHighCallback(
private val m: ReleasableReferenceManager
) : ActivityLifecycleCallbacks {
override fun onActivityStarted(activity: Activity) {
m.restoreStrongReferences()
}
}
/** メモリの空き容量の低下を扱うクラス。 */
private class MemoryLowCallback(
private val m: ReleasableReferenceManager
) : ComponentCallbacks2 {
override fun onTrimMemory(level: Int) {
val doRelease = when (level) {
TRIM_MEMORY_RUNNING_MODERATE, TRIM_MEMORY_RUNNING_LOW -> false
TRIM_MEMORY_RUNNING_CRITICAL -> true
TRIM_MEMORY_BACKGROUND -> false
TRIM_MEMORY_MODERATE, TRIM_MEMORY_COMPLETE -> true
TRIM_MEMORY_UI_HIDDEN -> false
else -> false
}
if (doRelease) m.releaseStrongReferences()
}
}
@Singleton
@Component
interface ApplicationComponent {
fun myReleasableComponent(): MyReleasableComponent
@ForReleasableReferences(MyReleasable::class)
fun myReleasableReferenceManager(): ReleasableReferenceManager
}
/** 参照を解放する機能を持つコンポーネント。 */
@MyReleasable
@Subcomponent
interface MyReleasableComponent {
/* ... */
}
ProcessLifecycleOwner
もあるぞ!