一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して4日目です。クリックしてイベントの詳細をご覧ください。
この記事では主に、アクティビティライフサイクルモニタリングとそのアプリケーションを公式ライフサイクル、サードパーティライブラリGlide、およびPermissionXにすばやく実装する方法について説明します。
1.Activity
ライフサイクルモニタリング
Fragment
Activity
ライフサイクルモニタリングを実装する
ご存知のとおり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
ます。onDestory
Activity
PS: 通过FragmentManager的FragmentTransaction添加Fragment时,add方法的第二个参数tag不要直接传入TestFragment::class.java.simpleName,因为一旦Fragment发生了混淆,可能会出现多个添加的不同Fragment的tag相同的情况,影响后续使用
registerActivityLifecycleCallbacks
Activity
ライフサイクルモニタリングの実装(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;
}
复制代码
ご存知のとおり、with
Glideを使用する関数は、1つを渡す必要がありContext
ます。Activity
Fragment
Glideの目的は、またはのライフサイクルSupportRequestManagerFragment
を監視し、画像の読み込み要求を実行/復元し、画像の読み込み要求を停止し、リソース解放の一部の操作を実行することです。Fragment
Activity
界面可见
界面不可见
界面销毁
これは、リソースの浪費を減らすための画像読み込みのための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 Result
APIを使用して作成されています。詳細については、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
}
}
复制代码
ソースコードは非常にシンプルで、原理は冒頭で述べたものとまったく同じです。ご覧ください。