Sto sperimentando l'utilizzo di una WebView per visualizzare il contenuto Flash all'interno della mia attività. Tutto funziona perfettamente, ma quando l'utente preme la home key per mettere l'attività in sottofondo, il contenuto Flash continua a funzionare (il suono continua a suonare, ecc.)Come faccio a sospendere il contenuto Flash in una WebView Android quando la mia attività non è visibile?
Ho notato che sia il browser Android di serie che Dolphin Browser sembra evitare questo problema e sospendere correttamente il contenuto Flash quando l'attività di navigazione viene messa in background.
Idealmente vorrei una soluzione che uccide il WebView completamente se l'attività sta finendo, ma le pause altrimenti (in pratica copiando il comportamento predefinito del browser)
Ecco un semplice test ho messo insieme che carica un gioco su Kongregate che ha una musica di sottofondo:
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();
}
}
ho preso uno sguardo al più tardi fonte per lo stock del browser, e sembra di fare qualcosa di simile (chiamando pauseTimers/resumeTimers), anche se temo il codice che ho ho visto che non è aggiornato, perché chiama funzioni che non sembrano esistere e.
Ho verificato che la chiamata a pauseTimers sta funzionando testando con un semplice setInterval di JavaScript che aggiorna un contatore. C'è qualcos'altro ovvio che dovrei provare riguardo alla gestione di Window o View?
La documentazione per il Flash player cellulare dice:
Flash Player sarà anche mettere in pausa automaticamente la riproduzione SWF non è in vista o l'applicazione in primo piano, per esempio quando si riceve una chiamata o di allarme si spegne, a ridurre l'utilizzo della CPU, l'utilizzo della batteria e l'utilizzo della memoria.
Questo sembra funzionare perfettamente sia nel browser di serie che in Dolphin Browser, ma non nella mia app. Qualsiasi idea/soluzione sarebbe molto apprezzata!
Aggiornamento: Ecco la funzione che abbiamo aggiunto alla nostra attività per farlo funzionare. Noi lo chiamiamo con "onPause" nella funzione onPause della propria attività e "onResume" nella funzione onResume della propria attività:
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);
}
}
}
Come si chiama questo? Hai uno snippet di codice sull'utilizzo? –
Non è necessario utilizzare la reflection dal livello API 11. È sufficiente chiamare i metodi public onPause() e onResume() di WebView. – cprcrack