2015-03-26 3 views
2

Когда мое приложение выходит (кнопка возврата, 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; 
     } 
    } 

} 
+1

Я не могу говорить специально для Кордовы, но если ваш процесс запущен, и процесс имел в нем «WebView», может быть, до того, как «WebView» получит сбор мусора. И, если что-то статическое имеет ссылку на него (прямое или косвенное), «WebView» не может быть собрано в мусор. – CommonsWare

+0

Проводка кода будет полезна. – Squonk

+0

@CommonsWare Кордоба пытается уничтожить веб-просмотры, и я не вижу никакой ссылки на мой веб-просмотр в моем EmptyService выше ... – Crag

ответ

0

Это было, по-видимому, ошибка в Кордова - Кордова 5.0.0 не имеет такого поведения, так что переход от 3,6 до 5,0 исправления для меня.

Смежные вопросы