Métodos de ciclo de vida da atividade de monitoramento e explicações de caso

Adquira o hábito de escrever juntos! Este é o 4º dia da minha participação no "Nuggets Daily New Plan·April Update Challenge", clique para ver os detalhes do evento .

Este artigo explica principalmente como implementar rapidamente o monitoramento do ciclo de vida da atividade e sua aplicação no ciclo de vida oficial, bibliotecas de terceiros Glide e PermissionX

1. ActivityMonitoramento do ciclo de vida

  • FragmentImplemente Activityo monitoramento do ciclo de vida

Como todos sabemos, Fragmenta distribuição do ciclo de vida médio é principalmente dependente Activity, portanto, para monitorar Activityo ciclo de vida, podemos adicionar diretamente um vazio 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()
}
复制代码

Dessa forma, podemos monitorar o ciclo de vida nos métodos como , e executar a lógica relevante onCreate.onDestoryActivity

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

  • registerActivityLifecycleCallbacksImplementar Activityo monitoramento do ciclo de vida (api>=29)

Este método é fornecido principalmente pelo SDK>=29, veja o código-fonte:

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

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

Vamos ver mActivityLifecycleCallbacksonde ele é chamado. Aqui está um onStartexemplo do ciclo de vida da 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();
    ...
}
复制代码

ActivityO método onStarté chamado no dispatchActivityStarted()ciclo de vida da distribuição, o último primeiro chama para collectActivityLifecycleCallbacks()obter a coleção de retorno de chamada do ciclo de vida adicionada e a converte em uma matriz e, em seguida, percorre o onStartciclo de vida da atividade de distribuição por sua vez

2. Caso 1: Prática de aplicação do ciclo de vida da biblioteca oficial

A biblioteca oficial também é um monitoramento do ciclo de vida lifecycleimplementado pela combinação dos dois métodos acima :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());
}

复制代码

Como você pode ver no código-fonte, se SDK >= 29, o registerActivityLifecycleCallbacksciclo de vida de monitoramento é usado e, se for menor que 29, é monitorado adicionando ReportFragment-o à Activity.

Pode-se notar que mesmo se sdk>=29, a lógica adicionada ainda seguirá ReportFragment, isso é principalmente para compatibilidade com versões antigas

3. Caso 2: Prática de aplicação da biblioteca Glide

Glide define uma classe chamada SupportRequestManagerFragment, herdada 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();
    }
}
复制代码

getSupportRequestManagerFragment()adicionando aActivity

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

Como todos sabemos, a withfunção que usa Glide precisa passar em um Context, que pode ser Activity, Fragmentetc.

O objetivo do Glide SupportRequestManagerFragmenté monitorar o ciclo de vida de Fragmentou , quando executa/restaura a solicitação de carregamento de imagem, interrompe a solicitação de carregamento de imagem e realiza algumas operações de liberação de recursos.Activity界面可见界面不可见界面销毁

Esta é uma das medidas de otimização do Glide para carregamento de imagens para reduzir o desperdício de recursos

4. Caso 3: prática de aplicação da biblioteca PermissionX

Esta biblioteca implementa o aplicativo de permissão, e o aplicativo de permissão deve ser inseparável Activity. Para não invadir ao máximo a lógica da camada de negócios, aqui usamos habilmente o Fragmentmétodo de adição para obter o processamento de aplicativo de permissão e retorno de chamada:

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

O aplicativo de permissão acima é escrito usando a Activity ResultAPI. Para obter detalhes, consulte o artigo de Guoshen.

Adicionar à:

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

O código-fonte é muito simples, o princípio é exatamente o mesmo mencionado no início, basta dar uma olhada.

Acho que você gosta

Origin juejin.im/post/7082962634051420190
Recomendado
Clasificación