アクティビティのライフサイクルの方法とケースの説明の監視

一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して4日目です。クリックしてイベントの詳細をご覧ください

この記事では主に、アクティビティライフサイクルモニタリングとそのアプリケーションを公式ライフサイクル、サードパーティライブラリGlide、およびPermissionXにすばやく実装する方法について説明します。

1.Activityライフサイクルモニタリング

  • FragmentActivityライフサイクルモニタリングを実装する

ご存知のとおりFragment、中程度のライフサイクルの分布は主に依存Activityしているため、ライフサイクルを監視するためにActivity、空のライフサイクルを直接追加できますFragment

class TestFragment(): Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
       
    }

    override fun onDestroy() {
        super.onDestroy()
    }
}

//首先要获取activity
activity.supportFragmentManager.beginTransaction().apply {
    add(TestFragment(), "TestFragment").commit()
}
复制代码

このようにして、などのメソッドでライフサイクルを監視し、関連するロジックを実行できonCreateます。onDestoryActivity

PS: 通过FragmentManager的FragmentTransaction添加Fragment时,add方法的第二个参数tag不要直接传入TestFragment::class.java.simpleName,因为一旦Fragment发生了混淆,可能会出现多个添加的不同Fragment的tag相同的情况,影响后续使用

  • registerActivityLifecycleCallbacksActivityライフサイクルモニタリングの実装(api> = 29)

このメソッドは主にSDK>=29によって提供されます。ソースコードを見てください。

//回调集合
private final ArrayList<Application.ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
        new ArrayList<Application.ActivityLifecycleCallbacks>();

//添加监听Activity生命周期的回调
public void registerActivityLifecycleCallbacks(
        @NonNull Application.ActivityLifecycleCallbacks callback) {
    synchronized (mActivityLifecycleCallbacks) {
        mActivityLifecycleCallbacks.add(callback);
    }
}
复制代码

mActivityLifecycleCallbacksどこで呼ばれているのか見てみましょう。onStartアクティビティのライフサイクルの例を次に示します。

private Object[] collectActivityLifecycleCallbacks() {
    Object[] callbacks = null;
    synchronized (mActivityLifecycleCallbacks) {
        if (mActivityLifecycleCallbacks.size() > 0) {
            callbacks = mActivityLifecycleCallbacks.toArray();
        }
    }
    return callbacks;
}

    private void dispatchActivityStarted() {
        getApplication().dispatchActivityStarted(this);
        //获取mActivityLifecycleCallback回调数组
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i = 0; i < callbacks.length; i++) {
            //分发start生命周期
                ((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityStarted(this);
            }
        }
    }


protected void onStart() {
    ...
    //调用dispatchActivityStarted实现生命周期分发
    dispatchActivityStarted();
    ...
}
复制代码

Activityメソッドは配布ライフサイクルでonStart呼び出さdispatchActivityStarted()、後者は最初collectActivityLifecycleCallbacks()に追加されたライフサイクルコールバックコレクションを取得して配列に変換し、次に配布アクティビティのonStartライフサイクルを順番にトラバースします。

2.ケース1:公式図書館ライフサイクルの適用慣行

公式ライブラリはlifecycle、上記の2つの方法を組み合わせて実装されActivityたライフサイクルモニタリングでもあります。

public static void injectIfNeededIn(Activity activity) {
    if (Build.VERSION.SDK_INT >= 29) {
        LifecycleCallbacks.registerIn(activity);
    }
    //兼容旧版本
    android.app.FragmentManager manager = activity.getFragmentManager();
    if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
        manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
        manager.executePendingTransactions();
    }
}


static void registerIn(Activity activity) {
    activity.registerActivityLifecycleCallbacks(new LifecycleCallbacks());
}

复制代码

ソースコードからわかるように、SDK> = 29の場合はregisterActivityLifecycleCallbacks監視ライフサイクルが使用され、29未満の場合はReportFragmentアクティビティに追加して監視されます。

sdk> = 29であっても、追加されたロジックは引き続き続くことに注意してくださいReportFragment。これは主に古いバージョンとの互換性のためです。

3.ケース2:グライドライブラリアプリケーションの練習

Glideは、SupportRequestManagerFragmentから継承された、という名前のクラスを定義しFragmentます。

public class SupportRequestManagerFragment extends Fragment {
    private final ActivityFragmentLifecycle lifecycle;
    
    @Override
    public void onStart() {
      lifecycle.onStart();
    }

    @Override
    public void onStop() {
      lifecycle.onStop();
    }

    @Override
    public void onDestroy() {
      lifecycle.onDestroy();
    }
}
复制代码

getSupportRequestManagerFragment()追加することによってActivity

@NonNull
private SupportRequestManagerFragment getSupportRequestManagerFragment(
    @NonNull final FragmentManager fm, @Nullable Fragment parentHint) {
  SupportRequestManagerFragment current = pendingSupportRequestManagerFragments.get(fm);
  if (current == null) {
    current = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      current = new SupportRequestManagerFragment();
      fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
    }
  }
  return current;
}
复制代码

ご存知のとおり、withGlideを使用する関数は、1つを渡す必要がありContextますActivityFragment

Glideの目的は、またはのライフサイクルSupportRequestManagerFragmentを監視し、画像の読み込み要求を実行/復元し、画像の読み込み要求を停止し、リソース解放の一部の操作を実行することです。FragmentActivity界面可见界面不可见界面销毁

これは、リソースの浪費を減らすための画像読み込みのためのGlideの最適化手段の1つです。

4.ケース3:PermissionXライブラリアプリケーションの実践

このライブラリはパーミッションアプリケーションを実装し、パーミッションアプリケーションは分離できない必要がありますActivity。ビジネスレイヤーのロジックにできるだけ侵入しないように、ここでは追加Fragmentメソッドを巧みに使用してパーミッションアプリケーションとコールバック処理を実現します。

class InvisibleFragment : Fragment() {
    private val requestWriteSettingsLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    //权限申请回调处理
        onRequestWriteSettingsPermissionResult()
    }
    //发起权限申请
    fun requestWriteSettingsPermissionNow(permissionBuilder: PermissionBuilder, chainTask: ChainTask) {
        requestWriteSettingsLauncher.launch(intent)
    }
}
复制代码

上記の許可申請書はActivity ResultAPIを使用して作成されています。詳細については、Guoshenの記事を参照してください。

追加:

private val invisibleFragment: InvisibleFragment
    get() {
        val existedFragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG)
        return if (existedFragment != null) {
            existedFragment as InvisibleFragment
        } else {
            val invisibleFragment = InvisibleFragment()
            fragmentManager.beginTransaction()
                .add(invisibleFragment, FRAGMENT_TAG)
                .commitNowAllowingStateLoss()
            invisibleFragment
        }
    }
复制代码

ソースコードは非常にシンプルで、原理は冒頭で述べたものとまったく同じです。ご覧ください。

おすすめ

転載: juejin.im/post/7082962634051420190
おすすめ