Méthodes de cycle de vie des activités de surveillance et explications de cas

Prenez l'habitude d'écrire ensemble ! C'est le 4ème jour de ma participation au "Nuggets Daily New Plan·April Update Challenge", cliquez pour voir les détails de l'événement .

Cet article explique principalement comment implémenter rapidement la surveillance du cycle de vie des activités et son application dans le cycle de vie officiel, les bibliothèques tierces Glide et PermissionX

1. ActivitySurveillance du cycle de vie

  • FragmentMettre en œuvre Activityla surveillance du cycle de vie

Comme nous le savons tous, Fragmentla distribution du cycle de vie moyen est principalement dépendante Activity, donc pour suivre Activityle cycle de vie, on peut directement en ajouter un vide 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()
}
复制代码

De cette façon, nous pouvons surveiller le cycle de vie des méthodes telles que , et exécuter la logique correspondante onCreate.onDestoryActivity

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

  • registerActivityLifecycleCallbacksMettre en œuvre Activityla surveillance du cycle de vie (api>=29)

Cette méthode est principalement fournie par SDK>=29, regardez le code source :

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

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

Voyons mActivityLifecycleCallbacksoù il s'appelle. Voici un onStartexemple du cycle de vie d'Activity :

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();
    ...
}
复制代码

ActivityLa méthode onStartest appelée dans le dispatchActivityStarted()cycle de vie de la distribution, cette dernière appelle d'abord pour collectActivityLifecycleCallbacks()obtenir la collection de rappel du cycle de vie ajoutée et la convertit en un tableau, puis traverse le onStartcycle de vie de l'activité de distribution à son tour

2. Cas 1 : Pratique d'application du cycle de vie de la bibliothèque officielle

La bibliothèque officielle, c'est aussi un suivi du cycle de vie lifecyclemis en œuvre par la combinaison des deux méthodes ci-dessus :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());
}

复制代码

Comme vous pouvez le voir dans le code source, si SDK >= 29, le registerActivityLifecycleCallbackscycle de vie de surveillance est utilisé, et s'il est inférieur à 29, il est surveillé en l'ajoutant ReportFragmentà Activity.

On peut remarquer que même si sdk>=29, la logique ajoutée suivra toujours ReportFragment, c'est principalement pour la compatibilité avec les anciennes versions

3. Cas 2 : Pratique d'application de la bibliothèque Glide

Glide définit une classe nommée SupportRequestManagerFragment, héritée de 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();
    }
}
复制代码

en getSupportRequestManagerFragment()ajoutant à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;
}
复制代码

Comme nous le savons tous, la withfonction qui utilise Glide doit passer un Context, qui peut être Activity, Fragmentetc.

Le but de Glide SupportRequestManagerFragmentest de surveiller le cycle de vie de Fragmentou , lorsqu'il exécute/restaure la demande de chargement d'image, arrête la demande de chargement d'image et effectue certaines opérations de libération de ressources.Activity界面可见界面不可见界面销毁

Il s'agit de l'une des mesures d'optimisation de Glide pour le chargement d'images afin de réduire le gaspillage de ressources

4. Cas 3 : Pratique d'application de la bibliothèque PermissionX

Cette librairie implémente permission application, et permission application doit être indissociable.Afin Activityde ne pas envahir au maximum la logique de la couche métier, nous utilisons ici astucieusement la Fragmentméthode d'addition pour réaliser permission application et callback processing :

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

L'application d'autorisation ci-dessus est écrite à l'aide de l' Activity ResultAPI. Pour plus de détails, veuillez consulter l'article de Guoshen.

Ajouter à:

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
        }
    }
复制代码

Le code source est très simple, le principe est exactement le même que celui évoqué au début, il suffit d'y jeter un œil.

Je suppose que tu aimes

Origine juejin.im/post/7082962634051420190
conseillé
Classement