【发布时间】:2017-12-16 18:17:19
【问题描述】:
我需要从 WebView 收集浏览器 cookie 并将它们返回给另一个 Activity。收集 cookie 已经有效,但发生在扩展 WebViewClient 的类中,我不知道如何从那里返回数据。
有 2 个活动;分别是 MainActivity 和 LoginActivity。 MainActivity 有一个按钮,它创建一个 Intent 并启动 LoginActivity,它有一个 WebView。 OnCreate(),WebView 指向一个网站的登录页面。当用户成功登录此站点时,它会将数据存储在浏览器 cookie 中——我稍后需要调用 API 的数据。如何将此数据返回到 MainActivity?
WebView 有一个自定义的 WebViewClient,其中重写了 OnPageFinished() 方法,如果 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 如何能够推迟返回 MainActivity,直到它从其 WebView 中获得数据。
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");
}
}
【问题讨论】:
-
一种简单的方法,您可以使用一些默认值将 cookie 存储在 sharedPreference 中,并在登录后在 main Activity 或 startActivity 中检查结果,然后返回结果。
-
问题在于时机;它看起来像一个多线程问题。我希望 LoginActivity 仅在获得 cookie 的密钥后返回 MainActivity。您的解决方案没有考虑时间。