AndroidライフサイクルコンポーネントLifecycleの使用方法の詳細

8451 ワード

前言
2018年のGoogle I/O大会で、GoogleはAndroid Jetpackを発表し、次世代のAndroidコンポーネントと呼ばれ、開発者のアプリケーション開発を加速させることを目的としています.正確には、Jetpackは、インフラストラクチャコンポーネント、アーキテクチャコンポーネント、動作コンポーネント、インタフェースコンポーネントを含む一連のAndroidソフトウェアコンポーネントの集合です.その中のAndroid Architecture Componentsとは、ここの「アーキテクチャコンポーネント」を指す.
Android Architecture Componentsは、Googleが推奨するAPPを構築するアプリケーションアーキテクチャで、いくつかのカラムアーキテクチャ関連コンポーネントが含まれています.この記事で紹介するLifecycleは、ライフサイクルに関連するライブラリの1つです.また、LifecycleもLiveDataとViewModelの2つのライブラリと密接に関連しており、理解したい場合は、まず理解しなければなりません.
具体的な各コンポーネント間の関係、およびJetpackにおけるそれぞれの地位については、以下の2枚の公式サイトからの画像を参照してください.
Lifecycleの役割
Lifecycleはライフサイクル感知能力を持つコンポーネントであり,つまりActivityやFragmentのライフサイクルが変化したときに通知される.Activityの様々なライフサイクルメソッドでは、ブロードキャストの登録解除、Eventbusの登録解除など、特定のメソッドを実行することがよくあります.
public class TestActivity extends AppCompatActivity {

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

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}

このようなライフサイクルに関連する論理コードの多くをActivityのライフサイクルメソッドに直接配置すると、Activityは維持しにくくなります.Lifecycleを通じて、私たちはこのような問題を避けることができます.本質的にはActivityやFragmentのライフサイクルが変化したときに通知して、対応するライフサイクルで対応する方法を実行する必要があるからです.
Lifecycleの基本使用
2.0、Lifecycle依存のインポート
Lifecycleはsupport library 26.00以降の依存パッケージに含まれています.プロジェクト依存のサポートライブラリバージョンが26.00以上の場合、Lifecycleライブラリを追加インポートする必要はありません.この例で使用するサポートライブラリは28.0.0です.
    implementation 'com.android.support:appcompat-v7:28.0.0'

サポートされているライブラリのバージョンが26.1.0未満の場合は、Lifecycleライブラリを個別にインポートする必要があります.
    implementation "android.arch.lifecycle:runtime:1.1.1"

もちろん、プロジェクトがAndroid Xに移行した場合は、次の方法で導入できます.
    implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"

やはり、できるだけ早くAndroid Xに移行してみることをお勧めします.多くの更新のため、Android Xで最初に発表され、伝統的なsupportパッケージから徐々に抜け出すことができます.例えばここでお話しするLifecycleはAndroid Xで2にアップグレードされています.xバージョン、サポートライブラリまたは1.xバージョン.
サポートライブラリは一般的に26.1.0以上であり、ほとんどのユーザーがAndroid Xに移行していないことを考慮して、この記事ではsupport library 28.0.0にデフォルトで含まれているLifecycleライブラリを使用します.プロジェクトのappディレクトリのbuild.gradleファイルに、次の依存性を追加します.
    implementation 'com.android.support:appcompat-v7:28.0.0'

support libraryバージョンが26.1.0以上であることを前提に、ここでは2つの状況に分けて説明します.1つは、我々が作成したActivityがAppCompatActivity(Activityの場合、Fragmentと同様)から継承され、もう1つはAppCompatActivityがAppCompatActivityではなく通常のActivityから継承されることである.
ここではまず、Lifecycleの実現メカニズムは観察者モードであり、全体的にこれを知っており、その使用過程は比較的理解しやすい.ライフサイクルの知覚能力を有する2.指定したLifecycleオブジェクトをリスニングするLifecycleObserverオブジェクトを構築します.LifecycleオブジェクトのaddObserver(...)メソッドを使用して、LifecycleオブジェクトとLifecycleObserverオブジェクトをバインドします.
2.1、AppCompatActivityから引き継ぐ
まず、MyObserverを作成します.JAvaクラスは、LifecycleObserverインタフェースを実装します(LifecycleObserverインタフェースは空のインタフェースで、主に注釈プロセッサに使用されます).
public class MyObserver implements LifecycleObserver {

    private static final String TAG = "MyObserver";

    //       @OnLifecycleEvent                    
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
//        ...
        Log.d(TAG, "connectListener:  --------   onResume" );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
//        ...
        Log.d(TAG, "disconnectListener: -------   onPause");
    }
}
getLifecycle()注釈を使用することによって、この方法はライフサイクル感知能力を有することが分かる.カッコ内のパラメータは、どのライフサイクルイベントを監視する必要があるかを示します.Lifecycleは主に@OnLifecycleEventEventの2つの列挙クラスによって関連するコンポーネントのライフサイクル状態を追跡する.具体的なEventとStateの変換関係は、次の図を参照してください.
次に、ActivityをAppCompatActivityから継承し、onCreate(...)メソッドでLifecycleとLifecycleObserverのバインドをStateで完了します.
public class MainActivity extends AppCompatActivity {

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

        //          ,   
        getLifecycle().addObserver(new MyObserver());
    }
}

その後、プログラムを実行してホームに切り替えたり、戻るキーを押したりすると、ライフサイクルの変化に伴ってMyObserver()で定義された方法がコンソールに正しく印刷されていることがわかります.
とても簡単だと思いますか.
しかし、少しも苦労しないのは、誰かがあなたのために「重荷を負って前進する」からだ.getLifecycle().addObserver(new MyObserver())以降のサポートライブラリでは、AppCompatActivityの祖先クラスsupport library 26.1.0SupportActivityインタフェースをデフォルトで実装しており、LifecycleOwnerメソッドによってgetLifecycle()オブジェクトを直接返すことができます.その後、このオブジェクトのaddObserver(...)メソッドでLifecycleを指定したLifecycleObserverにバインドできます.
2.2、普通のActivityから受け継ぐ
まず、Lifecycleオブジェクトを作成するには、上記のようにする必要があります.
今回は通常のActivityから継承されたActivityを作成します.getLifecycle()メソッドを直接使用してLifecycleを取得することはできません.直接使用することはできませんが、MyObserverの実装を真似て、Lifecycleオブジェクトを自分で作成することができますか?もちろんいいです.この場合、AppCompatActivityインタフェースを独自に実装し、特定のライフサイクルでLifecycleOwnerLifecycleRegistryメソッドによってイベントの配布をアクティブに行う必要があります.次の改造されたmarkState(...)コードを見てください.
public class MainActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry;

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

        mLifecycleRegistry = new LifecycleRegistry(this);
        getLifecycle().addObserver(new MyObserver());
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}
MainActivity.javaは、MainActivityインターフェース(このインターフェースを実装するオブジェクト、すなわちLifecycleの所有者)を実装し、そのgetLifecycle()メソッドではLifecycleOwnerオブジェクトが返され、LifecycleRegistryはLifecycleのサブクラスである.その他の使用方法は、まったく同じです.
Lifecycleでは、使用を容易にするために、現在のコンポーネントのライフサイクル状態を問い合わせる方法も用意されています.
lifecycle.getCurrentState().isAtLeast(STARTED)

まとめ
  • LifecycleObserverインタフェースを実現したクラスはLifecycleOwnerインタフェースを実現したクラスとシームレスに動作することができる.LifecycleOwnerはLifecycleオブジェクトを提供することができ、LifecycleObserverはこのLifecycleオブジェクトをリスニングする必要があるからだ.
  • LifecycleOwnerは、特定のクラス(ActivityやFragmentなど)から抽象化されたLifecycleの所有者である.
  • LifecycleRegistryクラス登録および逆登録には、現在のコンポーネントのライフサイクルを観察する必要があるLifecycleObserver
  • .
    に注意
    1.0.0-rc 1バージョンのLifecycleパッケージから開始し、ActivityのonSaveInstanceState()メソッド呼び出しが終了すると、LifecycleはすぐにCREATEDとON_としてマークされます.STOPは、onStop()メソッド呼び出しが終了するのを待つのではなく、終了する.この点はAPIレベル26以降のActivityのライフサイクルの呼び出し順序とは一致せず、少し注意が必要である.詳細については、関連ドキュメントをさらに参照してください.
    次の記事では、Lifecycleのソースコードを分析します.
    より多くの最新情報は、私の公衆番号に注目してください.
    転載先:https://juejin.im/post/5c767cf1f265da2dec624e27