Monitoreo del interruptor frontal y posterior de la aplicación Android

Hay un escenario en el desarrollo de la aplicación. Haga clic en el botón INICIO en la página principal para regresar al escritorio y luego regresar a la página de inicio de la aplicación. Cuando regrese a la página de inicio nuevamente, debe actualizar algunos datos o realizar algunas operaciones.

Actualmente hay tres opciones que se pueden implementar:

  • Escuche los eventos clave de inicio
  • Obtenga el mejor juicio de actividad
  • Registre la devolución de llamada del oyente del ciclo de vida de la actividad

Aunque los dos primeros esquemas pueden cumplir con los requisitos, tienen deficiencias y problemas obvios. Monitorear el botón Inicio no garantiza que cada modelo pueda monitorear normalmente, y diferentes ROM tendrán problemas de compatibilidad; para obtener el nivel superior de Actividad después de 6.0, debe abrir el permiso y también requiere una breve ronda de juicio de entrenamiento en el background, que consume rendimiento.
Afortunadamente, después de Android 4.0, se proporciona la clase ActivityLifecycleCallbacks, que puede monitorear los métodos del ciclo de vida de todas las actividades en la aplicación. Al observar la diferencia entre la interfaz principal que regresa al fondo y la interfaz principal que salta a otras interfaces de la aplicación, puede analizar la conmutación frontal y posterior del Plan de aplicación de monitoreo. En este escenario, el registro de devolución de llamada del método ActivityLifecycleCallbacks es el siguiente:

1.主页面 -> 桌面 -> 主页面

生命周期如下:... --(点HOME键)--> 主页面#onPause --(重新打开应用)--> 主页面#onResume -> ...

2.子页面 -> 主页面

生命周期如下:... -> 子页面#onPause -> ... -> 主页面#onResume ->...

Por lo tanto, siempre que sepa que la página principal llamó a onPause la última vez, y esta vez la página principal llamó a onResume, puede determinar si la aplicación está regresando desde el escritorio o desde otra APLICACIÓN. El código principal es el siguiente:

public class AppStatusCallbacks implements Application.ActivityLifecycleCallbacks {

private boolean mMainOnStoped = false;
private boolean mMainOnResumed = false;

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

}

@Override
public void onActivityStarted(Activity activity) {

}

@Override
public void onActivityResumed(Activity activity) {
mMainOnResumed = (activity instanceof MainActivity);
if (mMainOnPaused && mMainOnResumed) {
   // 应用从桌面或者其他应用回来
  
}
}

@Override
public void onActivityPaused(Activity activity) {
 
}

@Override
public void onActivityStopped(Activity activity) {
     mMainOnStoped= (activity instanceof MainActivity);
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}
}

Además, la aplicación generalmente almacena la pila de tareas de la Actividad, y el plan de evaluación se puede optimizar aún más juzgando el número de la pila de tareas actual. Cuando permanece en la interfaz principal, significa que el número de la pila de tareas de la actividad es 1. Agregue esta lógica al juicio anterior, para que el código sea más tolerante a fallas. El código completo es el siguiente:

public class AppStatusCallbacks implements Application.ActivityLifecycleCallbacks {

private boolean mMainOnStoped = false;
private boolean mMainOnResumed = false;
private int activityCount = 0;

@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

}

@Override
public void onActivityStarted(Activity activity) {
  activityCount++;
}

@Override
public void onActivityResumed(Activity activity) {
mMainOnResumed = (activity instanceof MainActivity);
if (mMainOnPaused && mMainOnResumed && activityCount == 1) {
   // 应用从桌面或者其他应用回来
  
}
}

@Override
public void onActivityPaused(Activity activity) {
}

@Override
public void onActivityStopped(Activity activity) {
     mMainOnStoped= (activity instanceof MainActivity);
     activityCount--;
}

@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override
public void onActivityDestroyed(Activity activity) {

}
}

Supongo que te gusta

Origin blog.csdn.net/zhireshini233/article/details/115256250
Recomendado
Clasificación