Androidアーキテクチャコンポーネント。 パート2.ライフサイクル

画像

前の記事で述べたように、ライフサイクルコンポーネントはライフサイクルでの作業を簡素化するように設計されていますが、ライフサイクルイベントに応答するコンポーネントへのアクティビティ/フラグメントコールバックを回避します。 この記事では、それがどのように機能し、どのように機能するかを詳細に分析します。

コンポーネント自体は、Lifecycle、LifecycleActivity、LifecycleFragment、LifecycleService、ProcessLifecycleOwner、LifecycleRegistryのクラスで構成されています。 インターフェース:LifecycleOwner、LifecycleObserver、LifecycleRegistryOwner。

ライフサイクル - ライフサイクルの状態に関する情報を保存し、他のオブジェクトがLifecycleObserver実装を使用して追跡できるようにするクラス。 メソッドで構成されます:addObserver(LifecycleObserver)、removeObserver(LifecycleObserver)およびgetCurrentState()。 名前が示すように、サブスクライバーを追加するには、削除し、それに応じて現在の状態を取得します。

状態を記述する2つの列挙型があります。 最初のイベント-ループの変更を示し、2番目のイベント-現在の状態を説明します。

イベント -ライフサイクルのステージを繰り返します。ON_CREATE、ON_RESUME、ON_START、ON_PAUSE、ON_STOP、ON_DESTROY、および特定のステージを参照せずに状態の変更を通知するON_ANYで構成されます。 ループ内の変更の追跡は、オブザーバー内のメソッドにOnLifecycleEventアノテーションを付けることで行われます。OnLifecycleEventアノテーションには、関心のあるイベントがパラメーターとして渡されます。

@OnLifecycleEvent(Lifecycle.Event.ON_ANY) void stateUpdated() { //         . } 

状態 -次の定数で構成されます:INITIALIZED、CREATED、STARTED、RESUMED、DESTROYED。 状態を取得するには、LifecycleのgetCurrentState()メソッドを使用します。 また、Enumステートでは、itAtLeast(State)メソッドが修正されました。これは、Stateがパラメーターとして渡されたもの以上であるかどうかの質問に答えます。

ライフサイクルコンポーネントを操作するには、所有者、つまりライフサイクルの所有者と、サブスクライブするオブザーバを決定する必要があります。 所有者は任意の数のサブスクライバーを持つことができます。また、所有者が対応するライフサイクルメソッドでsuper()メソッドを呼び出す前であっても、オブザーバーに状態の変更について通知されることに注意してください。

所有者は、LifecycleOwnerインターフェイスを実装する必要があります。このインターフェイスには、Lifecycleホルダークラスのインスタンスを返すgetLifecycle()メソッドが1つ含まれています。

オブザーバーは、LifecycleObserverマーカーインターフェイスを実装する必要があります。

新しいコンポーネントをまだサポートしておらず、したがってライフサイクルの実装を持たない所有者としてのカスタムアクティビティ/フラグメントの自己宣言のために、LifecycleRegistryクラスとLifecycleRegistryOwnerインターフェイスが作成されました。

LifecycleRegistryOwnerインターフェース 。これはLifecycleOwnerインターフェースを拡張しますが、唯一の違いはgetLifecycle()メソッドがLifecycleではなくLifecycleRegistryを返すことです。

LifecycleRegistryクラスは、Lifecycleの拡張機能であり、すべてのサポート作業を自分自身で行います。インスタンス化するだけです。

実装は次のようになります。

 public class MyFragment extends Fragment implements LifecycleRegistryOwner { LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this); @Override public LifecycleRegistry getLifecycle() { return lifecycleRegistry; } } 

android.arch.lifecycleパッケージには、LifecycleActivity、LifecycleFragment、LifecycleService、ProcessLifecycleOwnerの4つの所有者実装が含まれています。

LifecycleActivityは、 LifecycleRegistryOwnerを実装したFragmentActivityです。 これは作業を簡素化する一時的なソリューションであり、ドキュメントに記載されているように、ライフサイクルがサポートライブラリに統合されるまでです。

LifecycleFragmentは、LivecycleActivityの場合と同様に、LifecycleRegistryOwnerを実装する一時的なソリューションであるsupport.v4パッケージのフラグメントです。

LifecycleServiceは、 LifecycleOwnerでもあるサービスです。

ProcessLifecycleOwnerは、プロセス全体のライフサイクルを表すクラスです。 このクラスは、アプリケーションをバックグラウンドに移動したり、フォアグラウンドに戻したりする必要がある場合に役立ちます。

所有者とオブザーバーをバインドするには、所有者のgetLifecycle()を呼び出す必要がありますAddObserver(LifecycleObserver)以下に、これらすべてのクラスがどのように機能するかを示します。 デモンストレーションのために、ON_CREATEおよびON_STOP呼び出しをログに記録するSomeObserverクラスを作成し、すべての種類の所有者に使用します。したがって、簡単にするために、enumを追加しました。 :

 public class SomeObserver implements LifecycleObserver { private Owner owner; public SomeObserver(Lifecycle lifecycle, Owner owner) { this.owner = owner; lifecycle.addObserver(this); } @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) void onCreate() { Log.d(«Observer», owner + «: onCreate»); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) void onStop() { Log.d(«Observer», owner + «: onStop»); } enum Owner { ACTIVITY, FRAGMENT, PROCESS, SERVICE } } 

一般に、すべてのクラスでの作業は似ています。必要なのは、オブザーバーのインスタンスを作成してライフサイクルに署名するだけです。私の実装では、ライフサイクルをオブザーバーのコンストラクターに転送し、オブザーバーはすでにサブスクリプションに関与しています。 このアプローチは単なる好みの問題であり、それ以上のものではありません。

LifecycleActivityリスト:

 public class MainActivity extends LifecycleActivity { SomeObserver someObserver = new SomeObserver(getLifecycle(), SomeObserver.Owner.ACTIVITY); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(«Owner», «onCreate»); setContentView(R.layout.activity_main); } @Override protected void onStop() { super.onStop(); Log.d(«Owner», «onStop»); } } 

LifecycleFragmentリスト:

 public class MyFragment extends LifecycleFragment { SomeObserver someObserver = new SomeObserver(getLifecycle(), SomeObserver.Owner.FRAGMENT); public MyFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.<i>fragment_my</i>, container, false); } } 

LifecycleServiceをリストし、5秒間実行して終了します。アプリケーションから開始します。

 public class MyService extends LifecycleService { SomeObserver someObserver; @Override public int onStartCommand(Intent intent, int flags, int startId) { someObserver = new SomeObserver(getLifecycle(), SomeObserver.Owner.SERVICE); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { stopSelf(); } }, 5000); return super.onStartCommand(intent, flags, startId); } } 

ProcessLifecycleOwnerの場合、アプリケーションを展開することにしました。ご覧のとおり、ProcessLifecycleOwnerはシングルトンとして作成され、完全に独立したコンポーネントです。

 public class CustomApplication extends Application { private SomeObserver processObserver; @Override public void onCreate() { super.onCreate(); processObserver = new SomeObserver(ProcessLifecycleOwner.get().getLifecycle(), SomeObserver.Owner.PROCESS); Intent intent = new Intent(this, MyService.class); startService(intent); } } 

リンクで完全なリストを見ることができます: こちら

また、便利なリンク: oneおよびtwo

次の記事では、LiveDataコンポーネントについてさらに詳しく調べます。

Androidアーキテクチャコンポーネント。 パート1.はじめに
Androidアーキテクチャコンポーネント。 パート2.ライフサイクル
Androidアーキテクチャコンポーネント。 パート3. LiveData
Androidアーキテクチャコンポーネント。 パート4. ViewModel

Source: https://habr.com/ru/post/J332718/


All Articles