Как мне приостановить вспышку в Android WebView, когда моя деятельность не видна?

StackOverflow https://stackoverflow.com/questions/3431351

Вопрос

Я экспериментирую с использованием веб-просмотра для отображения содержимого вспышки внутри моей активности. Все работает довольно хорошо, но когда пользователь попадает в домашний ключ, чтобы поставить активность в фоновом режиме, содержимое вспышки продолжает работать (звук продолжает играть и т. Д.)

Я заметил, что как фонд Android Browser и браузер Dolphin, кажется, избегают этой проблемы, и правильно приостановить содержимое вспышки, когда активность просмотра введена в фоновый режим.

В идеале я хотел бы, чтобы решение полностью убивает 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();
        }
    }

Я посмотрел на последний источник для браузера на складе, и, похоже, делает что-то подобное (вызов пасцетимеров / возобновителей), хотя я боюсь, что код, которого я смотрел устарел, потому что это вызывает функции, которые не кажется, пока не существует.

Я проверил, что призыв к паузетимерам работает, тестирование с помощью простого JavaScript Setinterval, который обновляет счетчик. Есть ли что-то очевидное, что я должен пытаться в управлении окном или просматривать?

Документация для мобильного Flash Player говорит:

Flash Player также автоматически приостановит воспроизведение SWF. Это не ввиду или приложение переднего плана, например, когда вызов получен или тревоги выключается, чтобы уменьшить использование процессоров, использование аккумулятора и использование памяти.

Похоже, это отлично работает в браузере на складе, так и в браузере Dolphin, но не в моем приложении. Любые идеи / решения будут очень оценены!

Обновлять: Вот функция, которую мы закончили добавить к нашей деятельности, чтобы сделать это на работу. Мы называем это с помощью «OnPause» в функции OnPause Action и «Onreume» в функции Onreume активности:

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 () - это то, что вы хотите, учитывая комментарий:

Назовите это, чтобы приостановить любую дополнительную обработку, связанную с этим представлением, а также связанным домом / плагинами / JavaScript / etc. Например, если вид снят за окном экрана, это можно призвать для уменьшения ненужного процессора и / или сетевого трафика. Когда вид снова «активен», позвоните в OnResume ().

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top