与服务分离的webview?

时间:2015-03-26 16:35:40

标签: android cordova

当我的应用程序退出时(后退按钮,退出应用程序调用,任务杀手等),它会留下一个独立的webview,我可以在Chrome的检查器中看到它;即使我的应用已关闭,webview仍在运行。但是,如果我不启动前台服务,webview将按预期关闭。

我想解决这个问题 - 既要善待用户的记忆,又要防止僵尸webview做工作并造成破坏。

听起来像webview和服务之间有一些参考(webview有一些服务参考,反之亦然),但我找不到连接 - 我启动服务,我没有参考对它,它通过广播意图与我的CordovaPlugin类进行通信。

这是一个普遍的问题吗,如果某个应用运行某个服务,那么它的webview不会死掉?如果不是,我怎样才能找到让webview保持活力的内容?

编辑 - 评论要求代码,所以我创建了一个示例项目... startForeground调用导致僵尸webviews(没有这个调用,webviews关闭而不是保持打开为'分离')。

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 个答案:

答案 0 :(得分:0)

这显然是Cordova中的一个错误 - Cordova 5.0.0没有这种行为,所以从3.6升级到5.0为我修复了它。