Я экспериментирую с использованием 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, который обновляет счетчик. Есть ли что-то еще очевидное, что я должен попробовать в отношении управления окнами или представлениями?
В документации к мобильному Flash player сказано:
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);
}
}
}