2010-08-03 16 views
11

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.¿Cómo obtener cualquier identificador de la actividad más alta?

En pocas palabras, ¿hay una manera de:

  • obtener cualquier tipo de identificación (referencia de objeto, nombre de la clase, identificación, etc.) de la actividad más elevada,
  • recibir una notificación cuando más alta actividad cambios?

P.S. 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 cualquier cosa: navegador, aplicación de mapas, configuración, etc.

Respuesta

21

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

Estoy asumiendo que usted se refiere a las actividades dentro de su propia aplicación:

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

En cuanto al identificador, tal vez usted podría hacer que su servicio tiene un método estático que se llama por una actividad que viene al primer plano (en onResume()), el suministro de una referencia a sí mismo, su clase, alguna identificación arbitraria, etc.

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


Editar:

Se puede acceder a la identidad de la Actividad de la parte superior a través de ActivityManager -> tareas en ejecución ->ComponentName. Asegúrese de declarar <uses-permission android:name="android.permission.GET_TASKS" /> 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(); 

Para recibir una notificación, es probable que deba comprobar la Actividad superior cada x milisegundos.

+0

No, las actividades a las que me refiero pueden ser casi cualquier cosa, no necesariamente en mi propia aplicación. onResume() y onPause() serían útiles si fuera mi propia actividad. –

+0

Encontré tu respuesta (parcialmente) y edité mi publicación. –

+0

¡Genial! ¡Veré cómo/si funciona! –

1

Crear una baseActivity y se extiende todas las demás actividades de baseActivity, en onResume Guardar actividad actual en un public static Archivado en una clase mundial (en mi caso se extiende 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 
    } 
Cuestiones relacionadas