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.)¿Cómo detengo el contenido de Flash en una vista web de Android cuando mi actividad no está visible?
Me he dado cuenta de que tanto el navegador de Android como Dolphin Browser parece evitar este problema y pausar correctamente el contenido de Flash cuando la actividad de exploración se pone en segundo plano.
Idealmente me gustaría una solución que mata a la vista Web por completo si la actividad está acabando, pero hace una pausa de otra manera (básicamente, copiando el comportamiento por defecto del navegador)
Aquí es una prueba sencilla que arme que carga un juego en Kongregate que tiene 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();
}
}
me tomó un vistazo a la última fuente para el navegador de valores, y parece estar haciendo algo similar (llamando pauseTimers/resumeTimers), aunque temo el código I han estado mirando está desactualizado, porque está llamando funciones que no parecen existir mi.
Comprobé 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 para el flash player móvil dice:
Flash Player también se detendrá automáticamente la reproducción SWF no está a la vista o de la aplicación en primer plano, por ejemplo, cuando se recibe una llamada o alarma se apaga, a 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 hacer que esto funcione. La llamamos con "onPause" en función de la actividad onPause y "onResume" en función de la actividad onResume:
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);
}
}
}
¿Cómo llamas esto? ¿Tienes un fragmento de código del uso? –
No es necesario utilizar la reflexión desde el nivel API 11. Simplemente llame al público en los métodos onPause() y onResume() de WebView. – cprcrack