Comment faire une pause du contenu Flash dans un Android WebView lorsque mon activité n'est pas visible?

StackOverflow https://stackoverflow.com/questions/3431351

Question

J'expérimente l'utilisation d'une vue Web pour afficher le contenu Flash dans mon activité. Tout fonctionne assez bien, mais lorsque l'utilisateur frappe la clé d'accueil pour mettre l'activité en arrière-plan, le contenu flash continue de fonctionner (le son continue de jouer, etc.)

J'ai remarqué que le navigateur Android d'origine et le navigateur Dolphin semblent éviter ce problème, et en pause correctement le contenu Flash lorsque l'activité de navigation est mise en arrière-plan.

Idéalement, je voudrais une solution qui tue complètement la vue sur le Web si l'activité se termine, mais la fait une pause autrement (en copie essentiellement le comportement par défaut du navigateur)

Voici un test simple que j'ai réalisé qui charge un jeu sur Kongregate qui a de la musique de fond:

    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();
        }
    }

J'ai jeté un coup d'œil à la dernière source pour le navigateur d'origine, et il semble faire quelque chose de similaire (appeler des pausetimers / remiétimers), bien que je crains que le code que je regarde soit obsolète, car il appelle des fonctions qui ne sont pas Ce ne semblent plus exister.

J'ai vérifié que l'appel à PauseTimers travaille en testant avec un simple JavaScript setInterval qui met à jour un compteur. Y a-t-il autre chose évident que je devrais essayer en ce qui concerne la gestion de la fenêtre ou de la visualisation?

La documentation du lecteur Flash mobile dit:

Flash Player suscitera également automatiquement la lecture SWF qu'il n'est pas en vue ou l'application de premier plan, par exemple lorsqu'un appel est reçu ou que l'alarme se déclenche, pour réduire l'utilisation du processeur, l'utilisation de la batterie et l'utilisation de la mémoire.

Cela semble fonctionner parfaitement dans le navigateur d'origine et le navigateur Dolphin, mais pas dans mon application. Toutes les idées / solutions seraient grandement appréciées!

Mise à jour: Voici la fonction que nous avons fini par ajouter à notre activité pour faire fonctionner cela. Nous l'appelons avec "onPause" dans la fonction onPause de l'activité et "OnResume" dans la fonction OnResume de l'activité:

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);
        }
    }
}
Était-ce utile?

La solution

I don't see where you see that BrowserActivity or anything is calling pauseTimers(). I do see where onPause() for BrowserActivity eventually routes to onPause() of WebView. However, onPause() of WebView has the @hide annotation and so is not part of the SDK. Off the cuff, it would seem like onPause() is what you want, given the comment:

Call this to pause any extra processing associated with this view and its associated DOM/plugins/javascript/etc. For example, if the view is taken offscreen, this could be called to reduce unnecessary CPU and/or network traffic. When the view is again "active", call onResume().

Note the reference to "plugins", which is not mentioned in the pauseTimers() documentation.

I'd try using reflection to see if onPause() (and later onResume(), when you want stuff to start up again) does what you need. If it does, please post an issue to b.android.com about this, asking them to add these methods (or equivalents) to the SDK. Your requirement seems like it will be a common one, and a solution that goes past the SDK is not a good solution.

Autres conseils

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

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

This is how you call it in your activity... Works like a charm.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top