Я экспериментирую с использованием WebView для отображения содержимого Flash внутри своей деятельности. Все работает довольно хорошо, но когда пользователь нажимает клавишу «Домой», чтобы перевести действие в фоновый режим, Flash-контент продолжает работать (звук продолжает воспроизводиться и т. Д.)
Я заметил, что как стандартный Android-браузер, так и Dolphin Browser кажутся чтобы избежать этой проблемы и правильно приостановить содержимое 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-плеера гласит:
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);
}
}
}
Я не вижу, где вы видите, что BrowserActivity
или что-то еще вызывает pauseTimers()
. Я вижу, что onPause()
для BrowserActivity
в конечном итоге направляется к onPause()
из WebView
. Однако onPause()
из WebView
имеет аннотацию @hide
и поэтому не является частью SDK. Навскидку, кажется, что onPause() - это то, что вам нужно, учитывая комментарий:
Вызовите эту функцию, чтобы приостановить любую дополнительную обработку. обработку, связанную с этим представлением и связанным с ним DOM/плагины/javascript/etc. Для например, если представление будет выведено за пределы экрана, это может быть вызвано, чтобы уменьшить ненужный процессорный и/или сетевой трафика. Когда представление снова станет "активным", вызовите onResume().
Обратите внимание на ссылку на "плагины", которая не упоминается в документации pauseTimers()
.
Я бы попробовал использовать отражение, чтобы посмотреть, делает ли onPause()
(и позже onResume()
, когда вы хотите, чтобы все снова запустилось) то, что вам нужно. Если это так, пожалуйста, опубликуйте проблему на b.android.com об этом, попросив их добавить эти методы (или эквиваленты) в SDK. Ваше требование кажется распространенным, и решение, выходящее за рамки SDK, не является хорошим решением.