WebViewClient将数据返回到Activity onPageFinished
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebViewClient将数据返回到Activity onPageFinished相关的知识,希望对你有一定的参考价值。
我需要从WebView收集浏览器cookie并将它们返回给另一个Activity。收集cookie已经可以工作,但是在扩展WebViewClient
的类中发生,我不知道如何从那里返回数据。
有2个活动; MainActivity和LoginActivity分别。 MainActivity有一个按钮,用于创建Intent并启动LoginActivity,它具有单个WebView。 OnCreate()
,WebView被定向到网站的登录页面。当用户成功登录此站点时,它会将数据存储在浏览器cookie中 - 稍后我需要API调用的数据。如何将此数据返回给MainActivity?
WebView有一个带有重写的OnPageFinished()
方法的自定义WebViewClient,如果URL是预期的,将收集浏览器cookie,如下所示。
class TempWebViewClient extends WebViewClient {
@Override
public void onPageFinished(WebView view, String url) {
// If page URL is the Home page (ie., you logged in successfully), collect cookies.
if (url.equals("https://slate.sheridancollege.ca/d2l/m/home")) {
String cookies = CookieManager.getInstance().getCookie(url);
String[] cookies2 = cookies.split(";");
String key1 = "";
String key2 = "";
// Find Keys placed in browser cookies.
for (String c : cookies2) {
String[] c2 = c.split("=");
if (c2[0].equals(" phrase1")) {
key1 = c2[1];
}
if (c2[0].equals(" phrase2")) {
key = c2[1];
}
}
}
}
}
在我收到cookie中的密钥之前,LoginActivity不应该调用finish()
(返回MainActivity)。鉴于我已经拥有的,我怎样才能实现这一目标?我不知道LoginActivity如何在它拥有来自WebView的数据之前阻止返回MainActivity。
public class LoginActivty extends Activity {
WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
setupViews();
setContentView(webview);
}
public void setupViews() {
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
CookieManager.getInstance().setAcceptCookie(true);
webview = new WebView(this);
webview.setWebViewClient(new TempWebViewClient());
webview.getSettings().setjavascriptEnabled(true);
webview.loadUrl("website");
}
}
在TempWebclient中创建登录活动的引用,以便在获取cookie后传递结果。
class TempWebViewClient extends WebViewClient {
LoginActivty mDelegate;
public TempWebViewClient(LoginActivty ref) {
this.mDelegate = ref;
}
@Override
public void onPageFinished(WebView view, String url) {
// perform task
String cookie;// get from CookieManager
mDelegate.sendCookieAndFinish(cookie);
}
}
在登录活动中创建功能
public class LoginActivty extends Activity {
WebView webview;
@Override
protected void onCreate(Bundle savedInstanceState) {
....
}
public void setupViews() {
....
// send activity reference to webclient
webview.setWebViewClient(new TempWebViewClient(this));
}
public void sendCookieAndFinish(String cookie){
setResult(ResultCode,ResultIntent); // set result for your main activity
// store cookie to storage
finish();
}
}
从主活动启动您的LoginActivity以获得结果
以上是关于WebViewClient将数据返回到Activity onPageFinished的主要内容,如果未能解决你的问题,请参考以下文章
如何从 webViewClient.shouldInterceptRequest() 返回 Http 错误响应?
WebViewClient 和 WebChromeClient 是互斥的吗?
Webview shouldInterceptRequest方法始终返回null
WebViewClient 不会打开在 shouldOverrideUrlLoading() 中处理的页面