2012-04-25 11 views
6

Lo que intento hacer es enviar el evento de movimiento a la actividad que se está ejecutando actualmente. Tengo la ComponentName de la actividad actual de este código¿Obtener instancia de la actividad que se está ejecutando actualmente?

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 

// get the info from the currently running task 
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 

Log.d("current task :", "CURRENT Activity ::" + 
      taskInfo.get(0).topActivity.getClassName()); 

ComponentName componentInfo = taskInfo.get(0).topActivity; 

Ahora que tengo el nombre del componente, quiero distribuir el evento

dispatchTouchEvent(MotionEvent ev) 

que está en la clase Activity, y hacer esto necesito una instancia de la actividad actual. Estoy atascado en el nombre del componente. ¿Cómo puedo obtener la instancia Activity para poder enviar el evento?

+1

favor poner un poco más esfuerzo en el formato de su código próxima vez ... –

Respuesta

7

Guau, hay tantas cosas mal con esta pregunta que es difícil saber por dónde empezar! Vamos a tomar con el fin:

Lo que estoy tratando de hacer es enviar el evento de movimiento a la ejecución de la actividad actualmente

La actividad actual de primer plano recibirá eventos de movimiento, a menos que no debería. La única forma en que puedo imaginar que esto tenga algún sentido es que tu servicio ha puesto una ventana del sistema que está pasando por encima de todas las aplicaciones ... y en ese caso, te insto a que no lo hagas y solo dejes que tu primer plano actividad manejar el evento.

que tienen la ComponentName de la actividad actual de este código

ActivityManager.getRunningTasks() es no para el desarrollo de aplicaciones normales. Esto es para cosas como gerentes de tareas y tal. Nunca debe escribir la lógica del programa principal que tiene dependencias con la información devuelta por esta función. Eso está suplicando problemas, y de hecho puedo garantizar que ese código se romperá en algún momento. (¿Qué pasa cuando varias aplicaciones se pueden ejecutar en el frente, al mismo tiempo?)

Quiero distribuir el evento

Realmente, realmente no debería ser la rasgadura de eventos de movimiento de una ventana y metiéndolos en otro. Varios estados de envío no se configurarán correctamente, el estado en el evento no será uniforme (el evento se configuró con un origen y tal para la ventana original, no el nuevo en el que se está rellenando), etc. Este es otro Es una gran manera de hacer una aplicación escamosa que tiene buenas posibilidades de romperse en el futuro, si es que puede arriesgarse para que funcione en la actualidad.

Estoy atascado en el nombre del componente. ¿Cómo puedo obtener la instancia de la Actividad para que pueda enviar el evento?

De hecho, todo lo que tiene es un nombre de componente. Eso no tiene nada que ver con las instancias activas. No hay una forma mágica de convertir esto en una instancia real. Sería un error proporcionar uno, porque esto puede ser fácilmente ambiguo (si hubiera dos instancias de esa clase instanciadas).

Creo que necesita una copia de seguridad desde el principio y ver lo que realmente está tratando de lograr, para obtener ayuda sobre qué manera razonable de abordarlo. El camino por el que te has bajado es en este punto bastante terminal.

+0

Gracias por su respuesta detallada, pero ¿por qué estos métodos con los que cuenta la API, habrá alguna manera de usarlos – Ahmed

+0

Métodos como booleano \t dispatchGenericMotionEvent (MotionEvent ev) Llamado para procesar eventos de movimiento genéricos. boolean \t dispatchKeyEvent (evento KeyEvent) Llamado para procesar eventos clave. boolean \t dispatchKeyShortcutEvent (evento KeyEvent) Se invoca para procesar un evento de atajo de tecla. boolean \t dispatchPopulateAccessibilityEvent (Evento AccessibilityEvent) Llamado para procesar la población de AccessibilityEvents. boolean \t dispatchTouchEvent (MotionEvent ev) Llamado para procesar eventos de pantalla táctil. boolean \t dispatchTrackballEvent (MotionEvent ev) Llamado para procesar eventos de trackball. – Ahmed

+1

Básicamente no estoy interesado en que este método bloqueará la aplicación algún día, tengo que hacerlo en condición de funcionamiento a pesar de estos casos especiales que ha mencionado. – Ahmed

Cuestiones relacionadas