Подтвердить что ты не робот

Как приостановить 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);
        }
    }
}
4b9b3361

Ответ 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");
}

Так вы называете это в своей деятельности... Работает как шарм.