古人学问无遗力,少壮工夫老始成。这篇文章主要讲述如何永久保存Android webview中的cookie?相关的知识,希望能为你提供帮助。
使用下面的代码,我已经能够保存cookie,但是一旦我关闭应用程序,cookie就会消失。
这是怎么造成的,我该如何解决?
package com.jkjljkjimport android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class Activity extends Activity {/** Called when the activity is first created. */@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CookieSyncManager.createInstance(getBaseContext());
// Let's display the progress in the activity title bar, like the
// browser app does.getWindow().requestFeature(Window.FEATURE_PROGRESS);
WebView webview = new WebView(this);
setContentView(webview);
webview.getSettings().setjavascriptEnabled(true);
final Activity activity = this;
webview.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach 100%
activity.setProgress(progress * 1000);
}
});
webview.setWebViewClient(new WebViewClient() {public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//Users will be notified in case there's an error (i.e. no internet connection)
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}
});
CookieSyncManager.getInstance().startSync();
CookieSyncManager.getInstance().sync();
//This will load the webpage that we want to see
webview.loadUrl("http://");
}
}
答案在加载相关页面后,您必须告诉CookieSyncManager要同步。在示例代码中,
onCreate
方法在WebView
尝试加载页面之前完全执行,因此同步过程(异步发生)可能在页面加载之前完成。相反,告诉CookieSyncManager在WebViewClient中同步onPageFinished。这应该会得到你想要的。
CookieSyncManager Documentation是一个很好的阅读,如何正确地做到这一点。
以下是如何设置WebViewClient实现来为您执行此操作:
webview.setWebViewClient(new WebViewClient() {
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
//Users will be notified in case there's an error (i.e. no internet connection)
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
}public void onPageFinished(WebView view, String url) {
CookieSyncManager.getInstance().sync();
}
);
您不需要告诉CookieSyncManager在其他位置同步。我没有测试过这个,所以让我知道它是否有效。
另一答案.sync()是强制立即同步,并且必须在页面加载后调用它导致它与缓存同步RAM,因此cookie在调用之前必须处于ram状态。
如果您使用此方案,系统每5分钟自动同步一次
onCreate:
CookieSyncManager.createInstance(context)onResume:
CookieSyncManager.getInstance().startSync()onPause:
CookieSyncManager.getInstance().stopSync()
我认为你没有等待5分钟,所以系统保存cookie。
另一答案对于那些面临
CookieManager
类问题的人,即使在关闭应用程序后仍然使cookie保持不变,他们应该尝试使用flush()
的CookieManager
函数。请注意,我没有尝试过这个,所以如果有效的话请告诉我。
根据android文档
void flush()另外在qazxsw poi文档中写道:
确保当前可通过getCookie API访问的所有cookie都写入持久存储。此调用将阻止调用方,直到完成并可能执行I / O.
【如何永久保存Android webview中的cookie()】此类在API级别21中已弃用.WebView现在会根据需要自动同步Cookie。您不再需要创建或使用CookieSyncManager。要手动强制同步,您可以使用CookieManager方法flush(),它是sync()的同步替换。CookieSyncManager
推荐阅读
- Android文本字段元素可以选择,但不可编辑
- 如何在WebView Android中过滤手机和其他Web链接
- 在背景上每5分钟在Android应用程序中运行代码( [重复])
- Appcelerator Webview滚动到底部()
- 我错过了从Android webview打开谷歌地图的东西
- Android WebView是否需要打开外部URL的权限()
- Android蓝牙打印
- 如何为wpf c#application创建静默安装程序exe()
- Musical React App,我使用EC2,Lightsail还是S3