¿Registrar automáticamente eventos de ciclo de vida de Android mediante ActivityLifecycleCallbacks?

Estoy tratando de capturar y registrar automáticamente eventos de ciclo de vida de Android con ActivityLifecycleCallbacks, sin embargo la documentación sobre este asunto es escasa, por decir lo menos:

public void registerActivityLifecycleCallbacks (Application.ActivityLifecycleCallbacks callback) 

No quiero tener que extender la clase de Actividad o anular los métodos de ciclo de vida existentes (onCreate, onResume, etc …). Estoy buscando tener una clase separada escuchando estos eventos y actuando en consecuencia.

¿Alguien tiene alguna experiencia en esto, o tiene enlaces a la buena documentación sólida o tutoriales sobre cómo funciona? En concreto, ¿cómo registrarse en ActivityLifecycleCallbacks y cómo manejarlos?

Hice mi propia implementación de Application.ActivityLifecycleCallbacks . Estoy utilizando SherlockActivity , pero para la clase de actividad normal podría funcionar.

En primer lugar, estoy creando una interfaz que tiene todos los métodos para realizar un seguimiento del ciclo de vida de las actividades:

 public interface ActivityLifecycleCallbacks{ public void onActivityStopped(Activity activity); public void onActivityStarted(Activity activity); public void onActivitySaveInstanceState(Activity activity, Bundle outState); public void onActivityResumed(Activity activity); public void onActivityPaused(Activity activity); public void onActivityDestroyed(Activity activity); public void onActivityCreated(Activity activity, Bundle savedInstanceState); } 

En segundo lugar, implementé esta interfaz en la clase de mi aplicación:

 public class MyApplication extends Application implements my.package.ActivityLifecycleCallbacks{ @Override public void onCreate() { super.onCreate(); } @Override public void onActivityStopped(Activity activity) { Log.i("Tracking Activity Stopped", activity.getLocalClassName()); } @Override public void onActivityStarted(Activity activity) { Log.i("Tracking Activity Started", activity.getLocalClassName()); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { Log.i("Tracking Activity SaveInstanceState", activity.getLocalClassName()); } @Override public void onActivityResumed(Activity activity) { Log.i("Tracking Activity Resumed", activity.getLocalClassName()); } @Override public void onActivityPaused(Activity activity) { Log.i("Tracking Activity Paused", activity.getLocalClassName()); } @Override public void onActivityDestroyed(Activity activity) { Log.i("Tracking Activity Destroyed", activity.getLocalClassName()); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Log.i("Tracking Activity Created", activity.getLocalClassName()); } } 

Tercero, estoy creando una clase que se extiende desde SherlockActivity:

 public class MySherlockActivity extends SherlockActivity { protected MyApplication nMyApplication; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); nMyApplication = (MyApplication) getApplication(); nMyApplication.onActivityCreated(this, savedInstanceState); } protected void onResume() { // TODO Auto-generated method stub nMyApplication.onActivityResumed(this); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub nMyApplication.onActivityPaused(this); super.onPause(); } @Override protected void onDestroy() { // TODO Auto-generated method stub nMyApplication.onActivityDestroyed(this); super.onDestroy(); } @Override protected void onStart() { nMyApplication.onActivityStarted(this); super.onStart(); } @Override protected void onStop() { nMyApplication.onActivityStopped(this); super.onStop(); } @Override protected void onSaveInstanceState(Bundle outState) { nMyApplication.onActivitySaveInstanceState(this, outState); super.onSaveInstanceState(outState); } } 

En cuarto lugar, todas las clases que se extienden desde SherlockActivity, he reemplazado por MySherlockActivity:

 public class MainActivity extends MySherlockActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 

Ahora, en el logcat verá los logs programados en la implementación de Interfaz realizada en MyApplication.

ACTUALIZAR

Esta implementación fue probada desde el Nivel 9 de la API (Gingerbread), API Nivel 12 (Honeycomb) y API Nivel 17 (Jelly Bean) y funciona bien. Podría funcionar en las versiones anteriores de Android.

No tengo ninguna experiencia de primera mano, pero a juzgar por la API sólo puede escribir su propia clase que implementa la interfaz Application.ActivityLifecycleCallbacks y registrar esa clase en la instancia de clase de Application proporcionada

 getApplicaton().registerActivityLifecycleCallbacks(yourCustomClass); 

Esta clase recibirá las mismas devoluciones de llamada que sus actividades individuales. Buena suerte.

PD. Esto es API de nivel 14 btw, por lo que no funcionará en los teléfonos antiguos.

Pruebe esto: http://engineering.meetme.com/2015/04/android-determine-when-app-is-opened-or-closed/#comment-202

Propone un AppForegroundStateManager al que cada actividad reporta a través de sus onStop() y onStart() como ésta:

 @Override protected void onStart() { super.onStart(); AppForegroundStateManager.getInstance().onActivityVisible(this); } @Override protected void onStop() { AppForegroundStateManager.getInstance().onActivityNotVisible(this); super.onStop(); } 

Su clase Application implementa un listener como este:

 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AppForegroundStateManager.getInstance().addListener(this); } @Override public void onAppForegroundStateChange(AppForegroundStateManager.AppForegroundState newState) { if (AppForegroundStateManager.AppForegroundState.IN_FOREGROUND.equals(newState)) { // App just entered the foreground. Do something here! Log.i(TAG, "App Just Entered the Foreground with launch mechanism of: " + mLaunchMechanism); } else { // App just entered the background. Set our launch mode back to the default of direct. mLaunchMechanism = LaunchMechanism.DIRECT; } } } 

También incluye consejos y trucos para determinar cómo se abrió la aplicación: desde una notificación, una URL que abre la aplicación o directamente desde el menú Aplicaciones. Esto se hace a través de un Enum en la clase Application:

 public enum LaunchMechanism { DIRECT, NOTIFICATION, URL, BACKGROUND } private LaunchMechanism mLaunchMechanism = LaunchMechanism.DIRECT; public void setLaunchMechanism(LaunchMechanism launchMechanism) { mLaunchMechanism = launchMechanism; } 

En nuestra implementación de esto, tenemos indicadores para cuando iniciamos una actividad que lanzará una actividad de terceros, como si el usuario hace una llamada telefónica desde nuestra aplicación o si se inicia un navegador. En el onStop() la actividad de lanzamiento, hacemos un cheque como este para reportar sólo la no visibilidad de la actividad cuando esos indicadores son falsos:

 if(!flag_userLaunchedThirdPartyActivity){ AppForegroundStateManager.getInstance().onActivityNotVisible(this); } 

Para comprobar si la aplicación entra o no en segundo plano -por ejemplo, cuando la pantalla del dispositivo se oscurece o el usuario recibe una llamada telefónica- funciona de la siguiente manera:

 public static boolean isApplicationGoingToBackground(final Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> tasks = am.getRunningTasks(1); if (!tasks.isEmpty()) { ComponentName topActivity = tasks.get(0).topActivity; if (!topActivity.getPackageName().equals(context.getPackageName())) { setLaunchMechanism(LaunchMechanism.BACKGROUND); return true; } } setLaunchMechanism(LaunchMechanism.DIRECT); return false; } 

Esta solución no depende de un nivel de API, por lo que debería funcionar hasta el nivel 1 de la API.

  • Ciclo de vida de la actividad de Android: ¿para qué sirven todos estos métodos?
  • Ciclo de vida de Android View
  • Cómo distinguir entre el cambio de orientación y dejar la aplicación android
  • ¿Cómo puedo saber que OnResume viene después de onCreate?
  • Ciclo de vida de la actividad de Android en Jelly Bean
  • OnPause, onResume eventos en Android
  • Ciclo de vida y servicio de las aplicaciones de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.