Pregunta

Estoy experimentando con el uso de WebView para mostrar contenido Flash dentro de mi actividad.Todo funciona bastante bien, pero cuando el usuario presiona la tecla de inicio para poner la actividad en segundo plano, el contenido Flash sigue ejecutándose (el sonido sigue reproduciéndose, etc.)

He notado que tanto el navegador estándar de Android como Dolphin Browser parecen evitar este problema y pausan adecuadamente el contenido Flash cuando la actividad de navegación se pone en segundo plano.

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

Aquí hay una prueba simple que preparé 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();
        }
    }

Eché un vistazo a la fuente más reciente para el navegador estándar y parece estar haciendo algo similar (llamando a pausaTimers/resumeTimers), aunque me temo que el código que he estado mirando está desactualizado, porque llama a funciones que no Parece que ya no existe.

Verifiqué que la llamada a pausaTimers funciona probando con un simple setInterval de JavaScript 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 reproductor Flash móvil dice:

Flash Player también pausará automáticamente la reproducción de SWF si no está a la vista o en la aplicación en primer plano, por ejemplo, cuando se recibe una llamada o suena 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 estándar como en Dolphin Browser, pero no en mi aplicación.¡Cualquier idea/solución será muy apreciada!

Actualizar: 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);
        }
    }
}
¿Fue útil?

Solución

No veo donde ves eso BrowserActivity o cualquier cosa está llamando pauseTimers(). Veo donde onPause() por BrowserActivity eventualmente rutas a onPause() de WebView. Sin embargo, onPause() de WebView tiene el @hide anotación y así no forma parte del SDK. Fuera del brazalete, parece que ondPause () es lo que quieres, dado el comentario:

Llame a esto 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 pantalla, esto podría llamarse para reducir la CPU innecesaria y/o el tráfico de red. Cuando la vista esté nuevamente "activa", llame a OnResume ().

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

Intentaría usar la reflexión para ver si onPause() (y después onResume(), cuando quieres que las cosas se inicien de nuevo) hace lo que necesitas. Si es así, publique un problema para b.android.com Sobre esto, pidiéndoles que agregue estos métodos (o equivalentes) al SDK. Parece que su requisito será común, y una solución que pasa por el SDK no es una buena solución.

Otros consejos

@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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top