当我的应用程序退出时(后退按钮,退出应用程序调用,任务杀手等),它会留下一个独立的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;
}
}
}
答案 0 :(得分:0)
这显然是Cordova中的一个错误 - Cordova 5.0.0没有这种行为,所以从3.6升级到5.0为我修复了它。