EDIT MODE

モバイルアプリ開発に関することを書いています

Android Architecture Components 勉強会#1 に参加してきました

勉強会の参加レポート

GDG東京が主催のAndroid Architecture Components 勉強会の第1回目に参加してきました。 素晴らしい勉強会だったので記事にしたかったのと、学んだことの復習のために書いてます。

ちなみにこの勉強会は全4回の予定だそうで、Lifecycles(今回) -> LiveData -> ViewModel -> Roomと続いていくそうです。

gdg-tokyo.connpass.com

第1回目の講師は「あんざい」さんで、この方は本当に発表が上手いのですが今回もとても聞きやすくて、最後まで1ミリも飽きませんでした。

前半はLifecyclesの説明で、後半はあんざいさんが用意してくださった課題をみんなで取り組みました。課題にはいくつかの問いが用意されていて、動作確認後に参加者が答える形式だったので、楽しく課題に取り組めました。

課題も1個が丁度いいボリュームで、1時間くらいしかなかったにも関わらず、全部で5個くらいやったと思います。

以下のスライドに課題も載ってますが、現地でみんなとやるのが楽しかったので、もしお時間と場所的に可能であれば第2回目に参加することをおすすめします。

Lifecyclesの復習

1. 基本

必要な設定

プロジェクトのbuild.gradleにgoogleリポジトリ(Android Gradle Plugin 3.0ならデフォルトで記述有り)を追加して、モジュールのbuild.gradleにsupport-v4もしくはappcompat-v7を入れる。理由は、v26.1.0からsupport-v4のFragmentActivityやFragmentが、Lifecycleを組み込んでいるため。

メインクラス

  • Lifecycle
    • ライフサイクル状態の取得やObserverの追加・削除を行う

Enum

  • Lifecycle.State
    • ライフサイクル状態を表すenum
  • Lifecycle.Event
    • ライフサイクルのイベントを表すenum

Interface

  • LifecycleOwner
    • Lifecycleを持つクラスを表すためのsingle method interface
  • LifecycleObserver
    • Lifecycleに追加・削除できるObserverを表すinterface
    • @OnLifecycleEvent アノテーションをつけて自分でイベントメソッドを作る
    • Lifecycle.Event.ON_ANYは全てのイベントで呼ばれる
    • 第2引数でEventを受け取れる
  • GenericLifecycleObserver
    • あんざいさんが資料作成中にドキュメントから姿を消した幻のinterface
    • 便利なんだけど今後は使用しないほうがいいかも

その他

  • LifecycleRegistry
    • 複数のObserverを扱えるLifecycleの実装

2. 拡張機能

必要な設定

モジュールのbuild.gradleに以下を追記するだけ

dependencies {
    implementation 'android.arch.lifecycle:extensions:1.0.0'
}

便利クラス

  • LifecycleService
    • LifecycleOwnerが実装されたService
  • ServiceLifecycleDispatcher
    • ServiceにLifecycle機能をもたせるためのヘルパークラス
  • ProcessLifecycleOwner
    • アプリのプロセス全体に対するLifecycleを提供
    • こいつでアプリのForeground/Background判定が簡単に出来る
    • サポートライブラリでないFragmentでも検知可能

3. 注意点

onSaveInstanceState() まわりは要注意。 SupportLibraryのFragmentでは、onSaveInstanceState()が呼ばれると状態は CREATED になるようだ。

詳細は以下を読むほうがいい。

https://developer.android.com/topic/libraries/architecture/lifecycle.html#onStop-and-savedState

4. 基本的なサンプルコード

MainActivity.kt

class MainActivity : AppCompatActivity() {

    private val TAG_NAME = MainActivity::class.java.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // create observer
        val observer = object: LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_START)
            fun calledWhenOnStart(source: LifecycleOwner) {
                Log.i(TAG_NAME, "ON_START: " + source.lifecycle.currentState.name)
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
            fun calledWhenOnAny(source: LifecycleOwner, event: Lifecycle.Event) {
                Log.i(TAG_NAME, "ON_ANY: " + source.lifecycle.currentState.name + " arg2: " + event.name)
            }

            @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
            fun calledWhenOnDestroy(source: LifecycleOwner) {
                Log.i(TAG_NAME, "ON_DESTROY: " + source.lifecycle.currentState.name)
                // onDestroy()でやるより、ここでremoveObserverするのが楽
                source.lifecycle.removeObserver(this)
            }
        }
        // 何回addしても呼ばれるのは1回
        lifecycle.addObserver(observer)
    }