从WebView加载活动 - 首次安装应用程序,但之后没有安装?

时间:2016-08-05 05:42:41

标签: android android-activity android-webview

在我的Android应用程序的登录屏幕(LoginActivity)中,有一个“注册”按钮,可以将用户带到WebView(在SignupActivity中)中显示的注册网页。用户注册后(即单击“CreateAccount”按钮),我想将它们带回LoginActivity。

我目前的代码如下。它在第一次安装应用程序时有效,但在第二次重复该过程后,if / else子句根本没有触发(两个日志都没有显示,重定向也没有发生)。为什么呢?

public class SignupActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("SignupActivity", "Signup Activity started");

    WebView webView = new WebView(this);
    setContentView(webView);

    webView.setWebViewClient(new MyWebViewClient());
    webView.loadUrl("https://commons.m.wikimedia.org/w/index.php?title=Special:CreateAccount&returnto=Main+Page&returntoquery=welcome%3Dyes");

}

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.equals("https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes")) {
            // Signup success, so load LoginActivity again
            Log.d("SignupActivity", "Overriding URL");

            CookieSyncManager.createInstance(getApplicationContext());
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.removeAllCookie();
            cookieManager.setAcceptCookie(false);
            cookieManager.removeSessionCookie();

            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            startActivity(intent);
            return true;
        } else {
            Log.d("SignupActivity", "Not overriding URL, URL is: " + Uri.parse(url).getHost());
            return false;
        }

    }

}

在LoginActivity中,我已将此方法附加到按钮单击:

//Called when Sign Up button is clicked
    public void signUp(View view) {
        Intent intent = new Intent(this, SignupActivity.class);
        startActivity(intent);
    }

但是我是WebViews的新手,所以我很乐意在必要时更改此设置。

3 个答案:

答案 0 :(得分:1)

您应该简化覆盖WebViewClient中的shouldOverrideUrlLoading方法。然后,当用户注册时,应该将其重定向到让我们说成功页面。所以你知道成功的网址是https://www.example.com/success。在shouldOverrideUrlLoading中检查是否要加载的网址是成功网址。如果是,那么只需完成此活动并做任何你想做的事。

修改

private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.d("SignupActivity", "Loading URL: " + url);
        if (url.equals("https://commons.m.wikimedia.org/w/index.php?title=Main_Page&welcome=yes")) {
            // Signup success, so load LoginActivity again
            Log.d("SignupActivity", "Overriding URL");
            Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
            startActivity(intent);
            return true;
        } else {
            Log.d("SignupActivity", "Not overriding URL, URL is: " + Uri.parse(url).getHost());
            return false;
        }

    }
}

答案 1 :(得分:0)

对于这种情况,您可以采用简单的方法。当您单击“注册”按钮时,您可以从LoginActivity打开新活动(WebActivity)。

您可以在清单中将LoginActivity添加为WebActivity的ParentActivity。

因此,当您单击注册按钮并转到WebActivity时,请不要调用finish()方法,因为它会破坏您的LoginActivity。

现在,当您按下注册按钮时,WebActivity将在Backstack上打开并且LoginActivity在WebActivity中按下后退按钮时,super.backpressed()方法会将您重定向到LoginActivity。

更新(阅读评论后):

如果您想将用户重定向到LoginActivity,那么您可以在用户点击“创建帐户按钮”时调用Backpressed()方法。您的活动中应包含哪些

答案 2 :(得分:0)

我认为你需要JavascriptInterface才能做到这一点。

在阅读完您的问题之后,我认为您的问题的主要内容是“如何关闭WebView并将用户数据带到原生”。

将用户带到一个网页完全取决于你的逻辑,所以你需要考虑如何处理它。

但是如果您想要取回用户,则需要与网页进行互动。用户注册后,网页会告诉您注册是否成功,以及有关用户的数据。

调用此函数可将JavascriptInterface添加到WebView

WebView.addJavascriptInterface(Object object, String name)

注册后,网页使用JS来调用您的原生方法,在该方法中,您可以获得注册结果并执行您想要的操作。

您可能需要阅读this,了解有关JavascriptInterface

的更多信息