Как мне приостановить вспышку в Android WebView, когда моя деятельность не видна?
-
26-09-2019 - |
Вопрос
Я экспериментирую с использованием веб-просмотра для отображения содержимого вспышки внутри моей активности. Все работает довольно хорошо, но когда пользователь попадает в домашний ключ, чтобы поставить активность в фоновом режиме, содержимое вспышки продолжает работать (звук продолжает играть и т. Д.)
Я заметил, что как фонд 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");
}
Вот как вы называете это в своей деятельности ... работает как очарование.