Wie mache ich Flash -Inhalte in einem Android -Webview, wenn meine Aktivität nicht sichtbar ist?

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

Frage

Ich experimentiere mit einer Webview, um Flash -Inhalte in meiner Aktivität anzuzeigen. Alles funktioniert ziemlich gut, aber wenn der Benutzer den Heimtaste trifft, um die Aktivität in den Hintergrund zu bringen, läuft der Flash -Inhalt weiter (Sound spielt weiter usw.)

Mir ist festgestellt, dass sowohl der Stock Android -Browser als auch der Delphinbrowser dieses Problem zu vermeiden scheinen, und den Blitzinhalt ordnungsgemäß innehalten, wenn die Browseraktivität in den Hintergrund eingesetzt wird.

Idealerweise möchte ich eine Lösung, die das Webview vollständig tötet, wenn die Aktivität fertig ist, aber sie ansonsten pausiert (im Grunde kopiert das Standardverhalten des Browsers im Grunde genommen)

Hier ist ein einfacher Test, den ich zusammengestellt habe, der ein Spiel auf Kongregate lädt, das einige Hintergrundmusik aufweist:

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

Ich habe einen Blick auf die neueste Quelle für den Börsenbrowser geworfen, und es scheint etwas Ähnliches zu tun (Pausetimere/Lebensläufe), obwohl ich befürchte, dass der Code, den ich mir angesehen habe 'Ich scheinen nicht mehr zu existieren.

Ich habe überprüft, ob der Anruf bei Pausetimers mit einem einfachen JavaScript -SetInterval funktioniert, der einen Zähler aktualisiert. Gibt es noch etwas offensichtlich, das ich in Bezug auf das Fenster oder die Ansichtsmanagement versuchen sollte?

In der Dokumentation für den mobilen Flash -Player heißt es:

Flash Player pausiert auch automatisch die SWF -Wiedergabe. Sie ist nicht in Sicht oder in der Vordergrundanwendung, beispielsweise wenn ein Anruf empfangen wird oder der Alarm ausfällt, um die CPU -Auslastung, die Verwendung von Batterien und den Speicherverbrauch zu verringern.

Dies scheint sowohl im Börsenbrowser als auch im Delphinbrowser perfekt zu funktionieren, aber nicht in meiner App. Alle Ideen/Lösungen wären sehr geschätzt!

Aktualisieren: Hier ist die Funktion, die wir zu unserer Aktivität erweitert haben, damit dies funktioniert. Wir nennen es mit "Onpause" in der Onpause -Funktion der Aktivität und "OnResume" in der OnResume -Funktion der Aktivität:

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);
        }
    }
}
War es hilfreich?

Lösung

Ich sehe nicht, wo du das siehst BrowserActivity oder irgendetwas ruft an pauseTimers(). Ich sehe wo, wo onPause() zum BrowserActivity schließlich Routen zu onPause() von WebView. Jedoch, onPause() von WebView hat die @hide Annotation und so ist nicht Teil des SDK. Aus der Manschette scheint es, als ob Onpause () das ist, was Sie wollen, angesichts des Kommentars:

Rufen Sie dies an, um eine zusätzliche Verarbeitung zu pausieren, die dieser Ansicht und den zugehörigen DOM/Plugins/JavaScript/etc. Wenn die Ansicht beispielsweise außerhalb des Bildschirms genommen wird, kann dies aufgerufen werden, um unnötige CPU- und/oder Netzwerkverkehr zu reduzieren. Wenn die Ansicht erneut "aktiv" ist, rufen Sie OnResume () an.

Beachten Sie den Verweis auf "Plugins", der in der nicht erwähnt wird pauseTimers() Dokumentation.

Ich würde versuchen, Reflection zu verwenden, um zu sehen, ob onPause() (und später onResume(), wenn du willst, dass Sachen wieder anfangen), macht das, was du brauchst. Wenn dies der Fall ist, veröffentlichen Sie bitte ein Problem mit B.Android.com Darüber hinaus bitten Sie sie, diese Methoden (oder Äquivalente) zum SDK hinzuzufügen. Ihre Anforderung scheint eine häufige zu sein, und eine Lösung, die an der SDK vorbeikommt, ist keine gute Lösung.

Andere Tipps

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

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

So nennst du es in deiner Aktivität ... funktioniert wie ein Zauber.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top