2010-08-07 4 views
20

Ich experimentiere mit einem WebView, um Flash-Inhalte in meiner Aktivität anzuzeigen. Alles funktioniert ziemlich gut, aber wenn der Benutzer die Home-Taste gedrückt, um die Aktivität in den Hintergrund zu setzen, läuft der Flash-Inhalt weiter (Sound spielt weiter, usw.)Wie pausiere ich Flash-Inhalte in einem Android WebView, wenn meine Aktivität nicht sichtbar ist?

Ich habe festgestellt, dass sowohl die Aktie Android Browser und Dolphin Browser scheinen dieses Problem zu vermeiden und den Flash-Inhalt ordnungsgemäß anzuhalten, wenn die Browseraktivität in den Hintergrund gestellt wird.

Idealerweise würde ich eine Lösung gefällt, die die WebView tötet vollständig, wenn die Aktivität Finishing, sondern pausiert es sonst (im Grunde das Standardverhalten des Browsers kopieren)

Hier ist ein einfacher Test ich zusammen, dass ein lädt Spiel auf Kongregate, die Hintergrundmusik hat:

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 für den Lager-Browser auf die neueste Quelle einen Blick nahm, und es scheint etwas ähnliches (Aufruf pauseTimers/resumeTimers) zu tun, auch wenn ich den Code, den ich fürchte, betrachtet haben, ist veraltet, weil es Funktionen aufruft, die scheinbar nicht existieren e.

Ich habe überprüft, dass der Aufruf von pauseTimers funktioniert, indem Sie mit einem einfachen JavaScript setInterval testen, die einen Zähler aktualisiert. Gibt es noch etwas anderes, das ich in Bezug auf Window- oder View-Management ausprobieren sollte?

Die Dokumentation für den mobilen Flash-Player sagt:

Flash Player SWF auch automatisch die Wiedergabe unterbrechen wird es nicht in Sicht oder die Vordergrundanwendung, zum Beispiel, wenn ein Anruf eingeht oder Alarm losgeht, zu Verringern Sie die CPU-Auslastung, den Akkuverbrauch und die Speichernutzung.

Dies scheint sowohl im Stock Browser und Dolphin Browser perfekt zu funktionieren, aber nicht in meiner App. Irgendwelche Ideen/Lösungen würden sehr geschätzt werden!

Update: Hier ist die Funktion, die wir zu unserer Aktivität hinzufügten, um dies zum Laufen zu bringen. Wir nennen es mit „onPause“ in der onPause Aktivität Funktion 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); 
     } 
    } 
} 
+0

Wie nennt man das? Hast du ein Code-Snippet der Nutzung? –

+1

Keine Notwendigkeit, die Reflektion seit API Level 11 zu verwenden. Rufen Sie einfach die public onPause() und onResume() Methoden des WebView auf. – cprcrack

Antwort

8

Ich sehe nicht, wo Sie sehen, dass BrowserActivity oder irgendetwas pauseTimers() ruft. Ich sehe, wo onPause() für BrowserActivity schließlich Routen zu onPause() von WebView. onPause() von WebView hat jedoch die @hide Annotation und ist daher nicht Teil des SDK. Aus der Manschette, wäre es wie onPause() scheinen ist, was Sie wollen, angesichts der Kommentar:

Rufen Sie diese keine zusätzlichen Verarbeitung mit dieser Ansicht und den damit verbundenen DOM/plugins/javascript assoziiert pausieren/etc . Für Beispiel, wenn die Ansicht offscreen genommen wird, könnte dies zu 0 unnötigen CPU- und/oder Netzwerk Verkehr zu reduzieren. Wenn die Ansicht wieder " " "aktiv" ist, rufen Sie onResume() auf.

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

Ich würde versuchen, mit Reflection zu sehen, ob onPause() (und später onResume(), wenn Sie Sachen wieder neu starten wollen) tut, was Sie brauchen. Wenn dies der Fall ist, senden Sie ein Problem an b.android.com darüber und bitten Sie sie, diese Methoden (oder Äquivalente) zum SDK hinzuzufügen. Ihre Anforderung scheint zu sein, und eine Lösung, die über das SDK hinausgeht, ist keine gute Lösung.

+1

Der Aufruf von pauseTimers befindet sich in der pauseWebViewTimers-Methode der Browseraktivität. Ich kannte die @hide-Annotation nicht, deshalb dachte ich, dass ich vielleicht einen alten/anderen Code durchstöbere. Ich denke, dass Ihr Vorschlag, onPause/onResume durch Reflektion aufzurufen, ein großartiger ist. Ich werde Sie wissen lassen, wie das funktioniert, danke! – BenV

+0

Das funktioniert perfekt, ich danke Ihnen so sehr, dass Sie mich über die @hide Annotation informiert haben, ich wusste nicht einmal, dass ich diese Methoden durch Reflektion erreichen könnte. Ich werde ein Problem auf b.android.com veröffentlichen, wie Sie es vorgeschlagen haben! – BenV

+0

@BenV: Ich bin froh, dass es funktioniert hat! Wenn Sie daran denken, geben Sie hier einen Kommentar mit einem Link zu dem Problem, sobald Sie es ablegen. Ich würde das gerne im Auge behalten. – CommonsWare

7

So nennen Sie es in Ihrer Aktivität ... Funktioniert wie ein Zauber.

Verwandte Themen