Android WebChromeClient onCloseWindow无法正常工作

时间:2014-11-02 02:45:27

标签: android webview webchromeclient

我有一个简单的Android应用程序,可以打开webview来调用Web应用程序 我想在Web应用程序有window.close();

时关闭整个Android应用程序

我还希望后退键能够在网页中导航回来,这是有效的。

窗口正在关闭,但应用程序未关闭且日志未更新。我认为onWindowClose由于某种原因没有被触发。

这是我的Android应用程序 -

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.KeyEvent;

import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {

protected static final String TAG = null;
private WebView webView;


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode)
        {
        case KeyEvent.KEYCODE_BACK:
            if(webView.canGoBack()){
                webView.goBack();
            }else{
                finish();
            }
            return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Map<String,String> extraHeaders = new HashMap<String, String>();
    extraHeaders.put("X-Requested-With", "MY-App");


    //webview use to call own site
    webView = (WebView) findViewById(R.id.webView1);
    webView.setWebViewClient(new WebViewClient()); //use to hide the address bar      
    webView .getSettings().setJavaScriptEnabled(true);     
    webView .getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView .getSettings().setDomStorageEnabled(true); //to store history  
    webView.setWebViewClient(new WebViewClient()); 
    webView.loadUrl("http://www.Google.com",extraHeaders); 

    WebChromeClient wbc = new WebChromeClient(){


        public void onCloseWindow(WebView webView){
            super.onCloseWindow(webView);

            Log.d(TAG, "Window trying to close");
            Intent intent = new Intent(getApplicationContext(), MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
            finish();

        }

  };


  webView.setWebChromeClient(wbc);

 ;


 } 

这是Manifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.google"
android:versionCode="1"
android:versionName="1.0" 
<uses-sdk
  android:minSdkVersion="8"
  android:targetSdkVersion="16" />

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/Google"
    android:theme="@style/AppTheme" 
    android:noHistory="true"
    android:excludeFromRecents="true"
     >

    <activity
        android:name="com.example.google.MainActivity"
        android:label="@string/app_name" 
        android:clearTaskOnLaunch="true"
        android:configChanges="orientation|keyboard|keyboardHidden|screenSize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
  </activity>
  </application>

</manifest>'

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

行。我做了一些研究,发现某些浏览器禁用了window.close()。我真的只想在人们退出网站时关闭应用程序。

在网站php注销我添加了这个。

// return to main page

  header('Location: https://www.mainpage.com/');

然后我将MainActivity.Java改为:

package com.example.mainpage;

import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.util.Log;
import android.view.KeyEvent;


import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends Activity {

    protected static final String TAG = null;
    private WebView webView;


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN){
            switch(keyCode)
            {
            case KeyEvent.KEYCODE_BACK:
                if(webView.canGoBack()){
              //    Log.d(TAG, "Before Go Back");
                    webView.goBack();
                }else{
               //   Log.d(TAG, "Before Finish");
                    finish();
                }
                return true;
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    public class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.equals("https://www.mainpage.com/")) {
            //  Log.d(TAG, "Override");
            //  Log.d("TAG", url);
            //  Log.d(TAG, "Logging Out");
            //  Log.d(TAG, "Before Finish");
              finish();
              return true;
            }
            else {
            // Otherwise, give the default behavior (open in browser)
            //Log.d(TAG, "Do Not Override");
            //Log.d("TAG", url);
           // Log.d(TAG, "loading page");
            return false;
            }
        }

    }

public void onCreate(Bundle savedInstanceState) {

    Log.d(TAG, "In On Create");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Map<String,String> extraHeaders = new HashMap<String, String>();
    extraHeaders.put("X-Requested-With", "MY-App");

    webView = (WebView) findViewById(R.id.webView1);
    webView .getSettings().setJavaScriptEnabled(true);     
    webView .getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView .getSettings().setDomStorageEnabled(true); //to store history  
    webView.loadUrl("https://www.mainpage.com/Login.php",extraHeaders);              
    webView.setWebViewClient(new MyWebViewClient());    

  };

}