【Android】Android Architecture Componentsを使う – LifeCycle編

投稿者: | 2018年4月12日

最近、Android Architecture Componentsの1.0安定板が公開された。
まだ情報は少なく、APIの変更も頻繁に行われているようである。しかし、このライブラリはAndroidアプリを開発していく上での新たなコーディングスタイルの指針となるものであり、ネイティブアプリの開発者にとっては今後必修項目となるように感じられる。そこで、まずは Componentsのうちのひとつ、Lifecycleについて見ていくことにしたい。

Lifecycleとは

ある任意のクラスをActivityのライフサイクルに連動させることができる。これを使うと、これまではActivityやFragmentに書きがちだったActivity本来の処理とは関係のないアプリ特有のロジックを専用のクラスに移すことが容易になる。ActivityやFragmentの肥大化を防ぎ、各ロジックを受け持つクラスの責務がはっきりすることでコードの保守性が高まる。

準備

公式サイトにbuild.gradleにライブラリの依存を追加する方法が書いてある。しかし、実は最新のサポートライブラリ(本記事では27.1.1)を導入済みであれば、特に追加の設定なく使うことができた。この記事で作成したアプリのbuild.gradleを示す。

build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "sample.com.lifecyclelesson"
        minSdkVersion 14
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

これは、Android Studio 3.1で新しいプロジェクトを作成した時に自動的に作られたbuild.gradleそのものである。

ライフサイクルに連動させるクラスの作成

以下のように作成した。

MyClass.java
public class MyClass implements LifecycleObserver{
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void handleCreate(){
        Log.d("LifecycleLesson", "ON_CREATE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    void handleDestroy(){
        Log.d("LifecycleLesson", "ON_DESTROY");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void handlePause(){
        Log.d("LifecycleLesson", "ON_PAUSE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void handleResume(){
        Log.d("LifecycleLesson", "ON_RESUME");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void handleStart(){
        Log.d("LifecycleLesson", "ON_START");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void handleStop(){
        Log.d("LifecycleLesson", "ON_STOP");
    }
}

ライフサイクルに連動させるには、LifecycleObserverをimplementsする必要がある。とは言うものの、LifecycleObserverは空のインターフェースに過ぎないので実装すべきメソッドは無い。意味合いとしては「ライフサイクルを観測するクラスである」ということを明記する、といったところだろう。あとは、ライフサイクルイベントが発生した時に呼び出されてほしい任意のメソッドに@OnLifecycleEventアノテーションを付与するだけである。メソッドは引数無しvoidの形式を守っていれば、名前は何でも良い。アノテーションの引数にはライフサイクルイベントの種類を指定する。

LifeCycleObserverの登録

Activityに先ほどのクラスを登録する。コードは以下のようになる。

MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("LifecycleLesson", "Activity::onCreate");

        // Lifecycleを取得し、LifecycleObserverをimplementsしたクラスを渡す
        getLifecycle().addObserver(new MyClass());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        Log.d("LifecycleLesson", "Activity::onDestroy");
    }

    @Override
    protected void onPause() {
        super.onPause();

        Log.d("LifecycleLesson", "Activity::onPause");
    }

    @Override
    protected void onResume() {
        super.onResume();

        Log.d("LifecycleLesson", "Activity::onResume");
    }

    @Override
    protected void onStart() {
        super.onStart();

        Log.d("LifecycleLesson", "Activity::onStart");
    }

    @Override
    protected void onStop() {
        super.onStop();

        Log.d("LifecycleLesson", "Activity::onStop");
    }
}

最新のサポートライブラリのAppCompatActivityにはLifecycleを取得するためのgetLifecycle()メソッドがある。ActivityのonCreateのタイミングでLifecycleを取得し、addObserver()で登録することができる。

実行

アプリを起動、終了させると以下のようにLogcatに出力された。


04-11 23:01:58.680 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: Activity::onCreate
04-11 23:01:58.685 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: ON_CREATE
04-11 23:01:58.686 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: Activity::onStart
    ON_START
04-11 23:01:58.687 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: Activity::onResume
04-11 23:01:58.688 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: ON_RESUME
04-11 23:02:32.518 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: ON_PAUSE
    Activity::onPause
04-11 23:02:34.134 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: Activity::onResume
    ON_RESUME
04-11 23:03:33.507 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: ON_PAUSE
    Activity::onPause
04-11 23:03:33.979 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: ON_STOP
    Activity::onStop
04-11 23:03:33.980 20664-20664/sample.com.lifecyclelesson D/LifecycleLesson: ON_DESTROY
    Activity::onDestroy

Activityのイベントに連動して独自クラスのメソッドが呼び出されたことがわかる。

まとめ

Lifecycleを使うことで、簡単にActivityのライフサイクルに連動するクラスを作成することができた。今回はログを出力しただけだったが、実際にはアプリ特有の処理をこちらのクラスに書いていくことになるだろう。これまでのサンプルやチュートリアルで見られたActivityのon〜()系メソッドをオーバーライドして専用の処理を書いていたスタイルは今後、一変すると思う。最新のサポートライブラリに含まれているこの機能を積極的に使っていかない手はない。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です