Как приостановить Flash-контент в Android WebView, когда моя активность не видна?

Я экспериментирую с использованием 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);
        }
    }
}
20
задан BenV 15 October 2010 в 23:06
поделиться

1 ответ

Я не вижу, где вы видите, что BrowserActivity или что-то еще вызывает pauseTimers(). Я вижу, что onPause() для BrowserActivity в конечном итоге направляется к onPause() из WebView. Однако onPause() из WebView имеет аннотацию @hide и поэтому не является частью SDK. Навскидку, кажется, что onPause() - это то, что вам нужно, учитывая комментарий:

Вызовите эту функцию, чтобы приостановить любую дополнительную обработку. обработку, связанную с этим представлением и связанным с ним DOM/плагины/javascript/etc. Для например, если представление будет выведено за пределы экрана, это может быть вызвано, чтобы уменьшить ненужный процессорный и/или сетевой трафика. Когда представление снова станет "активным", вызовите onResume().

Обратите внимание на ссылку на "плагины", которая не упоминается в документации pauseTimers().

Я бы попробовал использовать отражение, чтобы посмотреть, делает ли onPause() (и позже onResume(), когда вы хотите, чтобы все снова запустилось) то, что вам нужно. Если это так, пожалуйста, опубликуйте проблему на b.android.com об этом, попросив их добавить эти методы (или эквиваленты) в SDK. Ваше требование кажется распространенным, и решение, выходящее за рамки SDK, не является хорошим решением.

8
ответ дан 30 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: