代码之家  ›  专栏  ›  技术社区  ›  Lior Iluz

Android Pie(9.0)多进程WebView

  •  5
  • Lior Iluz  · 技术社区  · 6 年前

    从android pie(api 28)开始,google不允许在两个不同的进程中使用单个webview实例。

    文档: https://developer.android.com/reference/android/webkit/WebView.html#setDataDirectorySuffix(java.lang.String)

    根据需要,我打了电话 WebView.setDataDirectorySuffix("dir_name_no_separator") 但不幸的是,我得到了一个例外。 我尝试在第二个流程服务onCreate()中调用此方法。

    java.lang.RuntimeException: Unable to create service com.myapp.service.MyService: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
            at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
            at android.app.ActivityThread.access$1300(ActivityThread.java:199)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1666)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6669)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
         Caused by: java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
            at android.webkit.WebViewFactory.setDataDirectorySuffix(WebViewFactory.java:136)
            at android.webkit.WebView.setDataDirectorySuffix(WebView.java:2165)
            at com.myapp.service.MyService.onCreate(MyService.java:134)
    

    我找不到这个例外的任何原因。我没有两次调用这个方法,也没有在主进程中调用它。有什么想法吗?

    1 回复  |  直到 5 年前
        1
  •  7
  •   yoAlex5    5 年前

    解决了的。

    我的项目主持AdMob广告,我称 MobileAds.initialize() 我的方法 Application onCreate() . ADS初始值设定项加载 WebView 现在禁止在调用 WebView.setDataDirectorySuffix("dir_name_no_separator") 方法。

    当创建第二个进程时,它也会经历相同的应用程序创建流,这意味着它调用相同的 创建()) 应用 类,它调用 mobileads.initialize()。 尝试创建新的 Web视图 实例和由此导致的崩溃。

    IllegalStateException: Can't set data directory suffix: WebView already initialized
    

    我是怎么解决的?

    我使用下面的方法获取进程名,并检查它是否是我的主进程-调用mobileads.initialize()方法,如果它是我的第二个进程,则调用 webview.setdatadirectorysuffix(“dir_name_no_separator”)。 方法。

    获取进程名称:

    public static String getProcessName(Context context) {
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == android.os.Process.myPid()) {
                return processInfo.processName;
            }
        }
    
        return null;
    }
    

    应用程序类onCreate():

    if (!Utils.getProcessName(this).equals("YOUR_SECOND_PROCESS_NAME")) {
        MobileAds.initialize(this);
    } else {
        WebView.setDataDirectorySuffix("dir_name_no_separator")
    }