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. Activity
Surveillance du cycle de vie
Fragment
Mettre en œuvreActivity
la surveillance du cycle de vie
Comme nous le savons tous, Fragment
la distribution du cycle de vie moyen est principalement dépendante Activity
, donc pour suivre Activity
le 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
.onDestory
Activity
PS: 通过FragmentManager的FragmentTransaction添加Fragment时,add方法的第二个参数tag不要直接传入TestFragment::class.java.simpleName,因为一旦Fragment发生了混淆,可能会出现多个添加的不同Fragment的tag相同的情况,影响后续使用
registerActivityLifecycleCallbacks
Mettre en œuvreActivity
la 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 mActivityLifecycleCallbacks
où il s'appelle. Voici un onStart
exemple 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();
...
}
复制代码
Activity
La méthode onStart
est 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 onStart
cycle 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 lifecycle
mis 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 registerActivityLifecycleCallbacks
cycle 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 with
fonction qui utilise Glide doit passer un Context
, qui peut être Activity
, Fragment
etc.
Le but de Glide SupportRequestManagerFragment
est de surveiller le cycle de vie de Fragment
ou , 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 Activity
de ne pas envahir au maximum la logique de la couche métier, nous utilisons ici astucieusement la Fragment
mé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 Result
API. 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.