如何保存和还原android WebView的WebBackForwardList?

时间:2019-12-24 13:22:43

标签: android webview android-webview

我正在尝试使用带有Android Studio的WebView来实现一个简单的Web浏览器应用程序。我想将WebView的状态(例如WebBackForwardList)保存到内部存储中,然后在重新启动该应用程序时将其还原。我不想只加载上次访问的url,相反,我还希望当我调用WebView的import matplotlib.pyplot as plt import numpy as np from sklearn.neighbors import KernelDensity def kernel_density_histo(sig, band=.1): X = np.linspace(np.min(sig)*0.9, np.max(sig)*1.1, 1000)[:, np.newaxis] kde = KernelDensity(kernel='gaussian', bandwidth=band).fit(sig[:, np.newaxis]) dens = np.exp(kde.score_samples(X)) plt.figure('kernel_density_histo', clear=True) plt.semilogx(X,dens, label='kernel') sig = np.random.lognormal(size=100) kernel_density_histo(sig) plt.hist(sig, bins=np.logspace(np.log(np.min(sig)), np.log(np.max(sig)), 30), density=True, rwidth=0.8, label='hist') plt.legend() plt.show() goBack()方法时,我希望它从内部存储中恢复上一个和下一个访问的链接。 / p>

我目前已经实现了自己的WebView,WebViewClient和WebChromeClient,并将访问的链接作为字符串保存到内部存储中,因此我可以通过在goForward()和{{1}的覆盖方法中调用loadUrl()来加载它们},同时还原。但这使页面的加载速度比WebView自己的goBack()goForward()方法慢,并且也无法恢复滚动位置,缩放等。

所以我有两个问题;

有一种方法可以通过调用goBack()方法来获取WebView的WebBackForwardList,但是有没有办法设置/编辑WebBackForwardList?

如果没有,重新启动应用程序后如何保存和还原它?

2 个答案:

答案 0 :(得分:0)

这不是最好的解决方案,但是我针对这种情况实施了一种解决方法。简而言之,我将WebBackForwardList的项目URL从零保存到当前索引,再保存到名为Stack的{​​{1}},从当前索引加最后一个索引保存到backStack。然后,我将这些堆栈和当前项目的URL保存到内部存储中。

重新启动应用程序时,WebView将加载当前项目URL。当用户想要前进或后退时,我首先检查WebView是否可以前进或后退。如果可以,我调用WebView的forwardStack方法。如果不能,则从保存到内部存储器的堆栈中弹出并加载URL。

但是,当从goBack()加载URL时,我不得不将当前WebBackForwardList项的URL推送到backStack并清除WebView历史记录。这是必需的,因为WebView会将最后加载的URL保存到WebBackForwardList的最后索引。这会扭曲WebBackForwardList,因为我正在加载上一个项目。

目前运行良好,但正如我所说,这不是最佳解决方案。

答案 1 :(得分:0)

您应该使用restoreStatesaveState进行保存和还原。

class AppWebTab extents WebView{
    long unique_tab_id;
   
    public void boolean load(){
        File stackpath = new File(getContext().getExternalCacheDir(), "webstack"+unique_tab_id);

        if(stackpath.exists()) {
            Parcel parcel = Parcel.obtain();
            byte[] data = ...//read file as Byte Array
            parcel.unmarshall(data, 0, data.length);
            parcel.setDataPosition(0);
            Bundle bundle = new Bundle();
            bundle.readFromParcel(parcel);
            parcel.recycle();
            
            WebBackForwardList stacks = restoreState(bundle);
            
            if(stacks!=null && stacks.getSize()>0) {
                return true;
            }
        }
        
        return false;
    }

    public void save(){
        File stackpath = new File(getContext().getExternalCacheDir(), "webstack"+unique_tab_id);
        
        Bundle bundle = new Bundle();
        
        WebBackForwardList stacks = saveState(bundle);

        if(stacks!=null&&stacks.getSize()>0) {
            Parcel parcel = Parcel.obtain();
            parcel.setDataPosition(0);
            bundle.writeToParcel(parcel, 0);
            byte[] bytes = parcel.marshall();
            parcel.recycle();
           ...//save Byte Array Data to file
        } else {
            stackpath.delete();
        }
    }
}

由于使用了铬,因此即使设备离线但本地缓存可用,保存的BackForwardList仍可导航。

但是您不能直接修改WebBackForwardList。因此,如果您有多个表示单个浏览器选项卡的Web视图(豪华但有时有用),则很难合并并保存多个BackForwardList作为一个,这很可惜。

相关问题