¿Cómo pause el contenido Flash en una Vista Web Android cuando mi actividad no está visible?

Estoy experimentando con el uso de un WebView para mostrar contenido Flash dentro de mi actividad. Todo funciona bastante bien, pero cuando el usuario pulsa la tecla de inicio para poner la actividad en segundo plano, el contenido de Flash sigue en funcionamiento (el sonido sigue sonando, etc.)

Me he dado cuenta de que tanto el navegador original de Android como Dolphin Browser parecen evitar este problema, y ​​pausan correctamente el contenido de Flash cuando la actividad de navegación se pone en segundo plano.

Idealmente, me gustaría una solución que elimine por completo el WebView si la actividad está finalizando, pero lo detiene de otra manera (básicamente copiando el comportamiento predeterminado del navegador)

Aquí hay una prueba simple que armé y que carga un juego en Kongregate que tiene algo de música de fondo:

public class BrowserTest extends Activity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWebView = new WebView(this); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.getSettings().setPluginsEnabled(true); mWebView.loadUrl("http://m.kongregate.com/games/Jiggmin/the-game-of-disorientation-mobile"); setContentView(mWebView); } @Override protected void onPause(){ super.onPause(); mWebView.pauseTimers(); if(isFinishing()){ mWebView.loadUrl("about:blank"); setContentView(new FrameLayout(this)); } } @Override protected void onResume(){ super.onResume(); mWebView.resumeTimers(); } } 

Eché un vistazo a la última fuente para el navegador de valores, y parece estar haciendo algo similar (llamando a pauseTimers / resumeTimers), aunque me temo que el código que he estado viendo está desactualizado, porque está llamando funciones que no usan parece que ya no existe

Verifiqué que la llamada a pauseTimers funciona probando con un simple JavaScript setInterval que actualiza un contador. ¿Hay algo más obvio que debería intentar con respecto a la administración de ventanas o vistas?

La documentación del reproductor Flash para dispositivos móviles dice:

Flash Player también pausará automáticamente la reproducción SWF que no está a la vista o la aplicación en primer plano, por ejemplo cuando se recibe una llamada o se activa una alarma, para reducir el uso de la CPU, el uso de la batería y el uso de la memoria.

Esto parece funcionar perfectamente tanto en el navegador de valores como en el navegador Dolphin, pero no en mi aplicación. ¡Cualquier idea / solución sería muy apreciada!

Actualización: Aquí está la función que terminamos agregando a nuestra actividad para que esto funcione. Lo llamamos con “onPause” en la función onPause de la actividad y “onResume” en la función onResume de la actividad:

 private void callHiddenWebViewMethod(String name){ if( mWebView != null ){ try { Method method = WebView.class.getMethod(name); method.invoke(mWebView); } catch (NoSuchMethodException e) { Log.error("No such method: " + name, e); } catch (IllegalAccessException e) { Log.error("Illegal Access: " + name, e); } catch (InvocationTargetException e) { Log.error("Invocation Target Exception: " + name, e); } } } 

No veo dónde ve que BrowserActivity o algo llama a pauseTimers() . Veo donde onPause() para BrowserActivity finalmente se dirige a onPause() de WebView . Sin embargo, onPause() de WebView tiene la anotación @hide y, por lo tanto, no es parte del SDK. Fuera del manguito, parece que OnPause () es lo que quieres, dado el comentario:

Llámalo para pausar cualquier procesamiento adicional asociado con esta vista y sus DOM / plugins / javascript / etc asociados. Por ejemplo, si la vista se toma fuera de la pantalla, esto podría llamarse para reducir el tráfico innecesario de la CPU y / o la red. Cuando la vista vuelva a ser “activa”, llame a Reanudar ().

Tenga en cuenta la referencia a “complementos”, que no se menciona en la documentación pauseTimers() .

Intentaría usar la reflexión para ver si onPause() (y luego onResume() , cuando quieres que las cosas se onResume() nuevo) hace lo que necesitas. Si es así, publique un problema en b.android.com sobre esto, y pídales que agreguen estos métodos (o equivalentes) al SDK. Parece que su requisito será común, y una solución que va más allá del SDK no es una buena solución.

 @Override protected void onPause() { super.onPause(); this.callHiddenWebViewMethod("onPause"); } @Override protected void onResume() { super.onResume(); this.callHiddenWebViewMethod("onResume"); } 

Así es como lo llamas en tu actividad … Funciona como un encanto.