Как приостановить Flash-контент в Android WebView, когда моя активность не видна? - PullRequest
20 голосов
/ 07 августа 2010

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

Я проверил, что вызовto 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);
        }
    }
}

Ответы [ 2 ]

8 голосов
/ 07 августа 2010

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

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

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

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

7 голосов
/ 10 января 2012
@Override
protected void onPause() {
    super.onPause();
    this.callHiddenWebViewMethod("onPause");
}

@Override
protected void onResume() {
    super.onResume();
    this.callHiddenWebViewMethod("onResume");
}

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

...