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. Activity
Monitoramento do ciclo de vida
Fragment
ImplementeActivity
o monitoramento do ciclo de vida
Como todos sabemos, Fragment
a distribuição do ciclo de vida médio é principalmente dependente Activity
, portanto, para monitorar Activity
o 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
.onDestory
Activity
PS: 通过FragmentManager的FragmentTransaction添加Fragment时,add方法的第二个参数tag不要直接传入TestFragment::class.java.simpleName,因为一旦Fragment发生了混淆,可能会出现多个添加的不同Fragment的tag相同的情况,影响后续使用
registerActivityLifecycleCallbacks
ImplementarActivity
o 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 mActivityLifecycleCallbacks
onde ele é chamado. Aqui está um onStart
exemplo 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();
...
}
复制代码
Activity
O 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 onStart
ciclo 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 lifecycle
implementado 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 registerActivityLifecycleCallbacks
ciclo 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 with
função que usa Glide precisa passar em um Context
, que pode ser Activity
, Fragment
etc.
O objetivo do Glide SupportRequestManagerFragment
é monitorar o ciclo de vida de Fragment
ou , 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 Fragment
mé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 Result
API. 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.