¿Cómo obtener cualquier identificador de la actividad más alta?

Tengo un servicio y su comportamiento debe cambiar cuando cambia la Actividad superior. Digamos que la actividad A está activa y luego el servicio inicia algún tipo de procesamiento. Este proceso debe detenerse cuando la Actividad A ya no esté visible: el usuario presionó “Atrás”, “Casa” o hizo cualquier otra cosa que hace que la Actividad A sea invisible. Esta Actividad A no debe conocer el servicio, es decir, no debe tener que informar explícitamente al Servicio que se va a ausentar.

En pocas palabras, ¿hay alguna manera de:

  • Obtenga cualquier tipo de identificación (referencia de objeto, nombre de clase, ID, etc.) de la actividad más alta,
  • ¿Recibe una notificación cuando la Actividad superior cambia?

PD Esto puede sonar como comportamiento de malware, ¡pero no lo es! ¡Es un caso de uso legítimo!

Editar: las actividades no están en mi aplicación. Pueden ser casi cualquier cosa: navegador, aplicación de mapas, configuraciones, etc.

Esta parte superior está desactualizada. Ver abajo para la respuesta.

Supongo que se refiere a Actividades dentro de su propia aplicación:

Todas las actividades llaman a onResume() al llegar al primer plano y a onPause() al salir del primer plano. Simplemente anule este método con su funcionalidad (asegúrese de llamar a super.onResume() y super.onPause() respectivamente!).

En cuanto al identificador, tal vez podría hacer que su Servicio tenga un método estático invocado por una Actividad que onResume() en primer plano (en onResume() ), proporcionando una referencia a sí mismo, su clase, alguna ID arbitraria, etc.

Referencia: http://developer.android.com/reference/android/app/Activity.html


Editar:

Puede acceder a la identidad de la Actividad superior a través de ActivityManager -> ejecutar tareas -> ComponentName . Asegúrese de declarar en su manifiesto.

 Context context = someArbitraryContext; ActivityManager am = (ActivityManager) context. getSystemService(Activity.ACTIVITY_SERVICE); String packageName = am.getRunningTasks(1).get(0).topActivity.getPackageName(); String className = am.getRunningTasks(1).get(0).topActivity.getClassName(); 

En cuanto a recibir una notificación, es probable que deba verificar la Actividad superior cada x milisegundos.

Cree una actividad baseActivity y amplíe todas las demás actividades de baseActivity , en onResume save Actividad actual en una sesión pública estática Archivada en una clase Global (en mi caso se extiende la aplicación)

 public class baseActivity extends Activity { @Override protected void onResume() { super.onResume(); Global.Activity = this; } } 

Otras actividades

  public class mainActivity extends baseActivity { // You Can Use Global.Activity Everywhere ! , Even in a Object Extended Class }