webview,在onResume上使用loadData会丢失历史记录

时间:2015-08-07 21:00:07

标签: android html webview browser-history

我有这个应用程序,它在webview中读取文章。首次启动ArticleActivity时,网页的html实际上会下载到字符串中并进行解析以使其看起来像移动网站,然后我使用wb.loadData(html, "text/html; charset=UTF-8", null);。下载发生在asynctask,因为我无法在ui线程上进行互联网活动,但是现在,只要点击页面上的链接,它就会根据webview客户端默认为loadUrl()。我可以在历史中使用goBack(),没问题。

问题在于搜索栏小部件。我调用SearchResultsActivity,它会打开一个webview并加载一个url。当用户点击文章时,SearchResultsActivity会通过intent将其发送回ArticleActivity。问题在于我想使用loadData()作为新文章链接,我尝试在onResume()中执行此操作,但如果我仍然在之前加载的页面上,则没有任何反应。日志语句显示来自EXTRA_RETURN_RESULT的Url确实成功了,所以我认为意图很好。我认为这是由于javascript"相同的起源"事情,这就是为什么如果我使用loadDataWithBaseURL(),页面加载。但是,如果我现在尝试后退按钮,之前加载的页面是空白的!加载新页面时,如何保存历史记录?

class SearchWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // if it is morning sign out AND is an article, send url to ArticleActivity
        if(Uri.parse(url).getHost().endsWith("morningsignout.com")) {
            Intent intent = new Intent(view.getContext(), ArticleActivity.class);
            intent.putExtra(Intent.EXTRA_RETURN_RESULT, url); // Put url in intent
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); // Open w/ old articleActivity if exists
            view.getContext().startActivity(intent);
            return true;
        }

//        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
//        view.getContext().startActivity(intent);
        return false;
    }
}
来自ArticleActivity的

@Override
protected void onResume() {
    super.onResume();

    // URL from CategoryActivity
    String intentURL = getIntent().getStringExtra(Intent.EXTRA_HTML_TEXT);

    // Set webView to new article
    if (intentURL != null) new URLToMobileArticle(webView).execute(intentURL);
    else {
        // If statement is reached, then intent originated from SearchResultsActivity
        intentURL = getIntent().getStringExtra(Intent.EXTRA_RETURN_RESULT);
        new URLToMobileArticle(webView).execute(intentURL);
        Log.d("ArticleActivity", "Loading: " + intentURL);
    }
}

URLToMobileArticle是什么,getArticles()是下载/解析功能:

public URLToMobileArticle(WebView webview) {
    this.wb = webview;
}

@Override
protected String doInBackground(String... params) {
    return getArticle(params[0]);
}

@Override
protected void onPostExecute(final String html) {
    wb.loadData(html, "text/html; charset=UTF-8", null);
    // wb.loadDataWithBaseURL(link, html, "text/html; charset=UTF-8", null, null);
    Log.d("URLToMobileArticle", "Loaded webpage");
}

1 个答案:

答案 0 :(得分:0)

答案是我可以使用shouldInterceptRequest()来始终以我认为合适的方式加载html。我只需要确保我可以区分网页网址和其他请求,如图片或样式表