Когда мое приложение выходит (кнопка возврата, exitApp вызов, убийца задачи и т. Д.), Он оставляет отдельный веб-просмотр, который я могу видеть в инспекторе Chrome; веб-просмотр все еще работает, хотя мое приложение закрыто. Однако, если я не запускаю службу переднего плана, веб-просмотр закрывается, как ожидалось.Отдельный веб-просмотр с обслуживанием?
Я хотел бы исправить это - как быть добрым к памяти пользователя, так и для предотвращения веб-просмотров зомби от работы и создания хаоса.
Это звучит так, как будто есть какая-то ссылка между веб-браузером и сервисом (у веб-браузера есть служба ref или наоборот), но я не могу найти соединение - я запускаю сервис, я не держу ссылаясь на него, и он общается с моим классом CordovaPlugin, передавая намерения.
Это общая проблема, что если приложение запускает службу, то ее веб-просмотр не умрет? Если это не так, как я могу найти, что поддерживает веб-просмотр?
EDIT - комментарий, запрошенный для кода, поэтому я создал образец проекта ... вызов startForeground вызывает веб-просмотры зомби (без этого вызова, веб-просмотр закрывается, а не остается открытым как «отсоединенный»).
package com.example.plugin;
import org.apache.cordova.*;
import org.json.JSONArray;
import org.json.JSONException;
import android.app.Notification;
import android.content.Context;
import android.content.Intent;
import android.app.PendingIntent;
import android.util.Log;
import android.app.Service;
import android.os.IBinder;
public class Hello extends CordovaPlugin {
private final static String LOG_TAG = "****** SERVICE STARTER *******";
@Override
public boolean execute(String action, JSONArray data, CallbackContext callbackContext) throws JSONException {
if (action.equals("startService")) {
startService();
return true;
} else {
return false;
}
}
private void startService() {
Context context = this.cordova.getActivity().getApplicationContext();
Intent service = new Intent(context, EmptyService.class);
context.startService(service);
}
public final static class EmptyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
// zombies created if this startForeground call is included
startForeground(1, getNotification());
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private Notification getNotification() {
Notification.Builder builder = new Notification.Builder(this);
builder
.setContentTitle("Service")
.setContentText("Running in fg, baby");
Notification notification = builder.build();
notification.flags |= Notification.FLAG_ONGOING_EVENT | Notification.FLAG_FOREGROUND_SERVICE | Notification.FLAG_NO_CLEAR;
return notification;
}
}
}
Я не могу говорить специально для Кордовы, но если ваш процесс запущен, и процесс имел в нем «WebView», может быть, до того, как «WebView» получит сбор мусора. И, если что-то статическое имеет ссылку на него (прямое или косвенное), «WebView» не может быть собрано в мусор. – CommonsWare
Проводка кода будет полезна. – Squonk
@CommonsWare Кордоба пытается уничтожить веб-просмотры, и я не вижу никакой ссылки на мой веб-просмотр в моем EmptyService выше ... – Crag