Как приостановить Flash-контент в Android WebView, когда моя активность не видна?
Я экспериментирую с использованием WebView для отображения содержимого Flash внутри моей активности. Все работает очень хорошо, но когда пользователь нажимает на домашний ключ, чтобы включить активность в фоновом режиме, содержимое Flash продолжает работать (звук продолжает воспроизводиться и т.д.).
Я заметил, что оба браузера Android и браузер Dolphin, похоже, избегают этой проблемы и правильно приостанавливают содержимое Flash, когда активность просмотра помещается в фоновый режим.
В идеале мне бы хотелось, чтобы решение полностью уничтожило WebView, если активность завершается, но в противном случае делает паузу (в основном копируя поведение браузера по умолчанию)
Вот простой тест, который я собрал, чтобы загрузить игру на Kongregate, которая имеет некоторую фоновую музыку:
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();
}
}
Я взглянул на последний источник для браузера акций, и, похоже, он делает что-то подобное (вызывая pauseTimers/resumeTimers), хотя я боюсь, что код, который я искал, устарел, потому что он звонит функции, которые больше не существуют.
Я убедился, что вызов pauseTimers работает путем тестирования с помощью простого JavaScript setInterval, который обновляет счетчик. Есть ли что-то еще очевидное, что я должен пытаться в отношении управления Window или View?
В документации для мобильного Flash-плеера говорится:
Flash Player также автоматически приостанавливает воспроизведение SWF, которое не отображается, или приложение переднего плана, например, когда прием принят или сигнал тревоги отключается, чтобы уменьшить загрузку процессора, использование батареи и использование памяти.
Кажется, что он отлично работает как в браузере акций, так и в браузере Dolphin, но не в моем приложении. Любые идеи/решения были бы очень благодарны!
Обновление:. Вот функция, которую мы добавили в нашу деятельность, чтобы заставить ее работать. Мы называем его "onPause" в функции onPause и "onResume" в функции onResume:
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);
}
}
}
Ответы
Ответ 1
Я не вижу, где вы видите, что BrowserActivity
или что-то вызывает pauseTimers()
. Я вижу, где onPause()
для BrowserActivity
в конечном итоге направляется на onPause()
из WebView
. Однако onPause()
of WebView
имеет аннотацию @hide
и поэтому не является частью SDK. От манжеты казалось бы, что onPause() - это то, что вы хотите, учитывая комментарий:
Вызовите это, чтобы приостановить любые дополнительные обработка, связанная с этим представлением и связанные с ним DOM/плагинов/JavaScript/и т.д.. Для Например, если представление выполнено вне экрана, это можно было бы назвать уменьшить ненужный процессор и/или сеть трафик. Когда представление снова "active", вызовите onResume().
Обратите внимание на ссылку на "плагины", которая не упоминается в документации pauseTimers()
.
Я бы попытался использовать отражение, чтобы увидеть, если onPause()
(и позже onResume()
, когда вы хотите, чтобы материал запускался снова) делает то, что вам нужно. Если да, отправьте вопрос на b.android.com об этом, попросив их добавить эти методы (или эквиваленты) в SDK. Ваше требование похоже, что оно будет распространенным, и решение, которое проходит через SDK, не является хорошим решением.
Ответ 2
@Override
protected void onPause() {
super.onPause();
this.callHiddenWebViewMethod("onPause");
}
@Override
protected void onResume() {
super.onResume();
this.callHiddenWebViewMethod("onResume");
}
Так вы называете это в своей деятельности... Работает как шарм.