功能详细的WebViewActivity

附带给网页端设置登录信息等。


package cchen.z.interview.A.webview;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.text.ClipboardManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.DownloadListener;
import android.webkit.GeolocationPermissions;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;

import cchen.z.interview.A.utils.StringUtil;
import cchen.z.interview.A.utils.Utils;
import cchen.z.interview.R;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class WebViewActivity extends Activity implements View.OnClickListener {
    public static final String TAG = WebViewActivity.class.getSimpleName();

    public static final String EXTRA_URL = "URL";
    public static final String EXTRA_TITLE = "title";
    public static final String EXTRA_RIGHT_ICON = "rightIcon";
    public static final String RIGHT_SHARE_BUTTON_DISPLAY = "right_share_btn_display";
    public static final String EXTRA_SHARE_URL = "extra_share_url";
    public static final String SCREEN_ORIENTATION_MODE = "screen_orientation_mode";

    public static final int SCREEN_ORIENTATION_PORTRAIT = 0;//竖屏
    public static final int SCREEN_ORIENTATION_LANDSCAPE = 1;//横屏
    public static final int SCREEN_ORIENTATION_SENSOR = 3;//根据手机方向判断

    private ProgressBar mHorizontalProgress;//顶部进度条
    private WebView mWebView;
    private boolean mIsRightShareBtnDisplay = false;
    private ViewGroup mToolbar;


    private String url;
    private String title;
    boolean rightIcon = true;

    private int source = 0;
    public static final String SOURCE_FROM = "SOURCE";
    public static final int FROM_CSL = 0x2;
    private String sso_tk;
    private HashMap<String, String> headers;

    private FrameLayout customViewContainer;
    private View mCustomView;
    private WebChromeClient.CustomViewCallback customViewCallback;
    private MyWebChromeClient myWebChromeClient;
    private SwipeRefreshLayout layout_swipe_refresh;//下拉刷新

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer);
        headers = new HashMap<>();

        if (getIntent() != null) {
            source = getIntent().getIntExtra(SOURCE_FROM, 0);
            title = getIntent().getStringExtra(EXTRA_TITLE);

            setOrientation();

            //拼接参数
            final String token1 = FakeUserCenter.getSSO_TOKEN();
            sso_tk = token1;

            switch (source) {
                case FROM_CSL:
                    url = "http://sso.xxxx/user/setUserStatus?from=mobile&next_action="
                            + URLEncoder.encode("http://next.html");
                    headers.put("SSOTK", token1);
                    break;
                case 0:
                    url = getIntent().getStringExtra(EXTRA_URL);
                    if (url != null) {
                        Uri uri = Uri.parse(url);
                        Uri.Builder builder = Uri.parse(url).buildUpon();

                        if (uri.getScheme() == null) {
                            builder.scheme("http");
                            url = builder.build().toString();
                        }
                        Uri baseUri = Uri.parse(url);
                        if (baseUri.getScheme() == null) {
                            url = baseUri.buildUpon().scheme("http").build().toString();
                        }
                    }

                    mIsRightShareBtnDisplay = getIntent().getBooleanExtra(RIGHT_SHARE_BUTTON_DISPLAY, true);
            }
            rightIcon = getIntent().getBooleanExtra(EXTRA_RIGHT_ICON, true);
            initToolbar();
        }
        mHorizontalProgress = (ProgressBar) findViewById(R.id.progress_horizontal);

        //有的url需要已登录用户的token
        if (url.contains("some_url_need_login")) {
            if (FakeUserCenter.isLogin()) {
                url = url + "&caller=1003&ssoTk=" + FakeUserCenter.getSSO_TOKEN();
            } else {
                url = "";
                TextView login = (TextView) findViewById(R.id.login);
                login.setVisibility(View.VISIBLE);
                login.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(WebViewActivity.this, "login for user`s info", Toast.LENGTH_LONG).show();
                        //                LoginService.addLetvLoginLayout(this, new LoginService.LetvLoginCallBack() {
//                    @Override
//                    public void success() {
//                        login.setVisibility(View.GONE);
//                        url = defultUrl + "&caller=1003&ssoTk=" + FakeUserCenter.getSSO_TOKEN();
//                        refresh();
//                    }
//                });
                    }
                });


            }
        }
        initWebView();

        layout_swipe_refresh = (SwipeRefreshLayout) findViewById(R.id.layout_swipe_refresh);
        layout_swipe_refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                refresh();
            }
        });

        refresh();

        //注册登录广播接收器用于回调h5传token id
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(FakeUserCenter.LOGIN_STATUS_CHANGE_ACTION);
        mLoginReceiver = new LoginReceiver();
        LocalBroadcastManager.getInstance(this).registerReceiver(mLoginReceiver, intentFilter);
//      LocalBroadcastManager只收发本APP的广播,不用担心数据泄露或者别人伪造广播。效率更高
    }

    private void initWebView() {
        mWebView = (WebView) findViewById(R.id.webview);

        WebSettings webSettings = mWebView.getSettings();

        //设置UA
        String userAgent = webSettings.getUserAgentString();
        webSettings.setUserAgentString(userAgent + getApplication().getApplicationInfo().name + Utils.getAppVersionName(this));


        // 设置支持JavaScript
        webSettings.setJavaScriptEnabled(true);

        //5.0以上支持http和https混合
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

        //网页有缩放的需求才会体现出此特性,比如访问的是电脑版网页
        webSettings.setSupportZoom(true);
        //显示原生缩放控制
        webSettings.setDisplayZoomControls(true);
        webSettings.setBuiltInZoomControls(true);


//        		webSettings.setDatabaseEnabled(true);
//        		String dir = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();

        //是否支持地理位置
        webSettings.setGeolocationEnabled(true);
//        		webSettings.setGeolocationDatabasePath(dir);

        //将图片调整到适合webview的大小
        webSettings.setUseWideViewPort(true);
        // 缩放至屏幕的大小
        webSettings.setLoadWithOverviewMode(true);


        //默认也都是开
        webSettings.setAllowFileAccess(true);//是否可以访问文件协议开头的资源
        webSettings.setAllowContentAccess(true);//是否可以访问contentProvider协议的资源


        //数据缓存分为两种:AppCache和DOM Storage(Web Storage)。
        //dom storage 可以持久化存储,类似sharePreference
        //如果网页端需要存储一些简单的用key/value对即可解决的数据,DOM Storage是非常完美的方案。
        webSettings.setDomStorageEnabled(true);
//        webSettings.setDatabasePath();已无效

//网页端的缓存。无关domStorage。
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        webSettings.setAppCacheEnabled(false);
        if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
            String cacheFolder =
                    "/sdcard"
//                    Environment.getExternalStorageDirectory().getAbsolutePath()
                            + File.separator + "ez_webview_cache";
            File cacheFolderFile = new File(cacheFolder);
            if (!cacheFolderFile.exists()) {
                boolean mkdirs = cacheFolderFile.mkdirs();
            }
            webSettings.setAppCachePath(cacheFolder);
            //cache存放在data/data/包名/
        }
        webSettings.setAppCacheMaxSize(Long.MAX_VALUE);//Android已改为自动管理

//        LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据,
//        LOAD_DEFAULT:根据cache-control决定是否从网络上取数据。HTTP 协议头里的 Cache-Control,
//        LOAD_CACHE_NORMAL:API level 17中已经废弃, 从API level 11开始作用同- - LOAD_DEFAULT模式,
//        LOAD_NO_CACHE: 不使用缓存,只从网络获取数据,
//        LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

//        http协议缓存机制是指通过 HTTP 协议头里的 Cache-Control(或 Expires)和 Last-Modified(或 Etag)等字段来控制文件缓存的机制。
//        Cache-Control 用于控制文件在本地缓存有效时长。最常见的,比如服务器回包:Cache-Control:max-age=600 表示文件在本地应该缓存,且有效时长是600秒(从发出请求算起)。在接下来600秒内,如果有请求这个资源,浏览器不会发出 HTTP 请求,而是直接使用本地缓存的文件。
//        Last-Modified 是标识文件在服务器上的最新更新时间。下次请求时,如果文件缓存过期,浏览器通过 If-Modified-Since 字段带上这个时间,发送给服务器,由服务器比较时间戳来判断文件是否有修改。如果没有修改,服务器返回304告诉浏览器继续使用缓存;如果有修改,则返回200,同时返回最新的文件。

//        Cache-Control 通常与 Last-Modified 一起使用。一个用于控制缓存有效时间,一个在缓存失效后,向服务查询是否有更新。
//        Cache-Control 还有一个同功能的字段:Expires。Expires 的值一个绝对的时间点,如:Expires: Thu, 10 Nov 2015 08:45:11 GMT,表示在这个时间点之前,缓存都是有效的。
//        Expires 是 HTTP1.0 标准中的字段,Cache-Control 是 HTTP1.1 标准中新加的字段,功能一样,都是控制缓存的有效时间。当这两个字段同时出现时,Cache-Control 是高优化级的。

//        Etag 也是和 Last-Modified 一样,对文件进行标识的字段。不同的是,Etag 的取值是一个对文件进行标识的特征字串。
//        在向服务器查询文件是否有更新时,浏览器通过 If-None-Match 字段把特征字串发送给服务器,由服务器和文件最新特征字串进行匹配,来判断文件是否有更新。
//        没有更新回包304,有更新回包200。
//        Etag 和 Last-Modified 可根据需求使用一个或两个同时使用。两个同时使用时,只要满足基中一个条件,就认为文件没有更新。


        //允许跨域访问
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
            webSettings.setAllowUniversalAccessFromFileURLs(true);


        //5.0以上打开webView跨域携带cookie的许可
        if (Build.VERSION.SDK_INT >= 21) {
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptThirdPartyCookies(mWebView, true);
        }
        mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
       /* if (Build.VERSION.SDK_INT < 19) {
            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }*/

        //处理webView的回调
        mWebView.setWebViewClient(webViewClient);

        //处理js回调
        mWebView.setWebChromeClient(myWebChromeClient = new MyWebChromeClient());

        mWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                Uri uri = Uri.parse(url);
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });

        //为webView隐藏的接口,可能被远程控制。
        mWebView.removeJavascriptInterface("searchBoxJavaBridge_");
        mWebView.removeJavascriptInterface("accessibility");
        mWebView.removeJavascriptInterface("accessibilityTraversal");

        mWebView.addJavascriptInterface(jsInterface, "myJsInterface");

        //长按打开图片
        mWebView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                WebView.HitTestResult result = ((WebView) v).getHitTestResult();
                int type = result.getType();
                String extra = result.getExtra();
                Log.d(TAG, type + " onLongClick  " + extra);

                if (type == WebView.HitTestResult.UNKNOWN_TYPE)
                    return false;

                switch (type) {
                    case WebView.HitTestResult.PHONE_TYPE:
                        break;
                    case WebView.HitTestResult.EMAIL_TYPE:
                        break;
                    case WebView.HitTestResult.GEO_TYPE:
                        break;
                    case WebView.HitTestResult.SRC_ANCHOR_TYPE:
                        break;
                    case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE:
                        break;
                    case WebView.HitTestResult.IMAGE_TYPE:
                        String saveImgUrl = result.getExtra();

                        Intent i = new Intent(Intent.ACTION_VIEW);
                        i.setData(Uri.parse(saveImgUrl));
                        startActivity(i);
                        break;
                    default:
                        break;
                }
                return true;
            }
        });

    }

    private void setOrientation() {
        int screen_mode = getIntent().getIntExtra(SCREEN_ORIENTATION_MODE, -1);
        if (screen_mode == SCREEN_ORIENTATION_PORTRAIT) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        } else if (screen_mode == SCREEN_ORIENTATION_LANDSCAPE) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else if (screen_mode == SCREEN_ORIENTATION_SENSOR) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
        }

    }

    private void refresh() {
        layout_swipe_refresh.setRefreshing(false);

        if (getIntent() != null) {
            switch (source) {
                case FROM_CSL:
                   /* Log.e("---url", url);
                    mWebView.loadUrl(url, headers);*/
                    CookieManager cookieManager = CookieManager.getInstance();
                    cookieManager.setCookie(url, "sso_tk=" + sso_tk);
                    mWebView.loadUrl(url, headers);
                    break;
                case 0:
                default:
                    if (FakeUserCenter.isLogin()) {
//                        SynLeSsoTk.setCookie(this, url, SynLeSsoTk.getInstances().getCookie(FakeUserCenter.getId(), WebViewActivity.this));
                    }
                    mWebView.loadUrl(url);
                    break;
            }
        }
    }

    WebViewClient webViewClient = new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (FakeUserCenter.isLogin()) {
//                SynLeSsoTk.setCookie(WebViewActivity.this, url, SynLeSsoTk.getInstances().getCookie(FakeUserCenter.getId(), WebViewActivity.this));
            }

            CookieSyncManager.createInstance(WebViewActivity.this);
            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setCookie(url, "sso_tk=" + sso_tk);
            CookieSyncManager.getInstance().sync();
            Uri uri = Uri.parse(url);
            if (url.startsWith("tel:") || url.startsWith("mailto:") || url.startsWith("weixin:")) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent);
                return true;
            } else if (uri.getScheme().equals("qq.launch") && uri.getHost().equals("www.qq.com")) {
                if ("h5".equals(uri.getQueryParameter("from"))) {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(intent);
                    return true;
                } else {
                    url = uri.getQueryParameter("url");
                    WebViewActivity.this.url = url;
                    mWebView.loadUrl(url);
                    return true;
                }
            } else if (uri.getScheme().equals("qq.client")) {
                return true;
            } else {
                //view.loadUrl(url);
                WebViewActivity.this.url = url;
                return super.shouldOverrideUrlLoading(view, url);
            }
        }

        @Override
        public void onFormResubmission(WebView view, Message dontResend, Message resend) {
            resend.sendToTarget();
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            view.loadUrl("www.baidu.com");
            Toast.makeText(view.getContext(), "net_error", Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.share:
                shareUrl();
                popWindow.dismiss();
                break;
            case R.id.copy:
                if (StringUtil.isEmpty(url)) break;
                ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
                if (clipboard == null) break;
                clipboard.setText(url);
                if (clipboard.getText().equals(url))
                    Toast.makeText(this, "url_has_been_copied", Toast.LENGTH_LONG).show();
                popWindow.dismiss();
                break;
            case R.id.open_in_explore:
                if (StringUtil.isEmpty(url)) break;
                Uri uri = Uri.parse(url);
                //                uri = uri.buildUpon().scheme("http").build();

                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                try {
                    startActivity(intent);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                popWindow.dismiss();
                break;
            case R.id.refresh:
                refresh();
                popWindow.dismiss();
                break;
            case android.R.id.home:
                finish();
                break;

        }
    }

    private void shareUrl() {
        Intent sendIntent = new Intent();
        sendIntent.setAction(Intent.ACTION_SEND);
        sendIntent.putExtra(Intent.EXTRA_TEXT, url);
        sendIntent.putExtra(Intent.EXTRA_SUBJECT, title);
        sendIntent.setType("text/plain");
        startActivity(sendIntent);
    }

    private class MyWebChromeClient extends WebChromeClient {
        private View mVideoProgressView;

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            if (newProgress >= 100) {
                if (mHorizontalProgress != null) {
                    mHorizontalProgress.setVisibility(View.GONE);
                }
            } else {
                if (mHorizontalProgress != null && newProgress >= 0) {

                    mHorizontalProgress.setVisibility(View.VISIBLE);
                    mHorizontalProgress.setProgress(newProgress);
                }
            }
        }

        //当网页弹出alert
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d(TAG, message);
            // This shows the dialog box.  This can be commented out for dev
            AlertDialog.Builder alertBuilder = new AlertDialog.Builder(WebViewActivity.this);
            alertBuilder.setMessage(message);
            alertBuilder.setTitle("Alert");
            alertBuilder.show();
            result.confirm();
            return true;
        }


        //当网页请求地理位置
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
            callback.invoke(origin
                    , true   //如果不允许的话,JS请求地理位置会得到error:permission denied by user
                    , false);

            Toast.makeText(getApplicationContext(), "onGeolocationPermissionsShowPrompt", Toast.LENGTH_LONG).show();
//            super.onGeolocationPermissionsShowPrompt(origin, callback);
        }

        @Override
        public void onReceivedTitle(WebView view, String mTitle) {
            super.onReceivedTitle(view, mTitle);
            if (TextUtils.isEmpty(mTitle) || mTitle.startsWith("http"))
                return;//有时候网页端没有设置title会返回url
            title = mTitle;
            if (mToolbar != null) {
                ((TextView) mToolbar.findViewById(R.id.tv_action_title)).setText(mTitle);
            }
        }

        @Override
        public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
            onShowCustomView(view, callback);
        }

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            if (mCustomView != null) {
                callback.onCustomViewHidden();
                return;
            }
            mCustomView = view;
            mWebView.setVisibility(View.GONE);
            customViewContainer.setVisibility(View.VISIBLE);
            customViewContainer.addView(view);
            customViewCallback = callback;
        }

        @Override
        public View getVideoLoadingProgressView() {
            if (mVideoProgressView == null) {
                LayoutInflater inflater = LayoutInflater.from(WebViewActivity.this);
                mVideoProgressView = inflater.inflate(R.layout.video_progress, null);
            }
            return mVideoProgressView;
        }

        @Override
        public void onHideCustomView() {
            if (mCustomView == null)
                return;
            mWebView.setVisibility(View.VISIBLE);
            customViewContainer.setVisibility(View.GONE);
            mCustomView.setVisibility(View.GONE);
            customViewContainer.removeView(mCustomView);
            customViewCallback.onCustomViewHidden();
            mCustomView = null;
        }

        @Override
        public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
            //需要弹出多窗口的情况。需要自己处理
            return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
        }
    }

    PopupWindow popWindow;

    private void initToolbar() {
        mToolbar = (ViewGroup) findViewById(R.id.toolbar);

        mToolbar.findViewById(R.id.img_back_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        ((TextView) mToolbar.findViewById(R.id.tv_action_title)).setText(title);
        if (rightIcon) {
            mToolbar.findViewById(R.id.right_btn).setVisibility(View.VISIBLE);
            mToolbar.findViewById(R.id.right_btn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    popWindow = new PopupWindow(WebViewActivity.this);
                    View mContentView = LayoutInflater.from(WebViewActivity.this).inflate(
                            R.layout.webview_menu_popwindow, null);
                    popWindow.setContentView(mContentView);
                    popWindow.setTouchable(true);
                    mContentView.setFocusable(true);
                    mContentView.setFocusableInTouchMode(true);
                    mContentView.findViewById(R.id.share).setOnClickListener(WebViewActivity.this);
                    mContentView.findViewById(R.id.copy).setOnClickListener(WebViewActivity.this);
                    mContentView.findViewById(R.id.open_in_explore).setOnClickListener(WebViewActivity.this);
                    mContentView.findViewById(R.id.refresh).setOnClickListener(WebViewActivity.this);
                    popWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
                    popWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
                    popWindow.setFocusable(true);
                    if (!mIsRightShareBtnDisplay) {
                        mContentView.findViewById(R.id.share).setVisibility(View.GONE);
                    }
                    popWindow.showAsDropDown(mToolbar.findViewById(R.id.right_btn), 0, 25);
                }
            });
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mWebView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mWebView.onPause();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mCustomView != null) {
                myWebChromeClient.onHideCustomView();
                return true;
            }
            if (mWebView.canGoBack()) {
                mWebView.goBack();
            } else {
                onBackPressed();
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void finish() {
        super.finish();
    }

    @Override
    public void onDestroy() {
        if (mWebView != null) {
            //webview调用destory时,webview仍绑定在Activity上.
            // 这是由于自定义webview构建时传入了该Activity的context对象,因此需要先从父容器中移除webview,然后再销毁webview.
            //还可以让webView运行在单独进程中,不用的时候直接system.exit(0)
            ViewParent parent = mWebView.getParent();
            if (parent != null) {
                //防止内存泄露。
                mWebView.clearHistory();
                ((ViewGroup) mWebView.getParent()).removeView(mWebView);
                mWebView.loadUrl("about:blank");
                mWebView.stopLoading();
                mWebView.setWebChromeClient(null);
                mWebView.setWebViewClient(null);
            }
            mWebView.removeAllViews();

            try {
                mWebView.destroy();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        if (mLoginReceiver != null) {
            LocalBroadcastManager.getInstance(this).unregisterReceiver(mLoginReceiver);
        }
        super.onDestroy();
    }

    private JsInterface jsInterface = new JsInterface();

    final class JsInterface {
        //有JavascriptInterface注解的才能被JS调用,防止被注入
        @JavascriptInterface
        public void getLoginData() {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    if (FakeUserCenter.isLogin()) {
                        //调用JS的方法
                        mWebView.loadUrl("javascript:loginCallBack('" + FakeUserCenter.getId() + "','" + FakeUserCenter.getSSO_TOKEN() + "')");
                    } else {
                        //login
//                        LoginService.addLetvLoginLayout(WebViewActivity.this);
                        // when success
                        mWebView.loadUrl("javascript:loginCallBack('" + FakeUserCenter.getId() + "','" + FakeUserCenter.getSSO_TOKEN() + "')");
                    }

                }
            });

        }

        @JavascriptInterface
        public void shareData(final String shareText, final String shareTitle, final String shareContentURL, final String shareIconUrl) {

            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    try {
                        String cUrl = mWebView.getUrl();
                        if (TextUtils.isEmpty(cUrl)) {
                            return;
                        }
                        Uri cUri = Uri.parse(cUrl);
                        /*String debug = cUri.getQueryParameter("debug");*/
                        String whiteKey = cUri.getHost();
                        if (TextUtils.isEmpty(shareText) || TextUtils.isEmpty(shareTitle) || TextUtils.isEmpty(shareContentURL)) {
                            mWebView.loadUrl("javascript:shareCallBack('0')");
                            return;
                        } else {
                            mWebView.loadUrl("javascript:shareCallBack('1')");
                            shareUrl();
                        }
                    } catch (Exception e) {
                        return;
                    }


                }
            });

        }
    }

    class LoginReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String action = intent.getAction();
                if (action != null && FakeUserCenter.LOGIN_STATUS_CHANGE_ACTION.equals(action)) {
                    onLoginStatusChanged();
                }
            }

        }
    }
    private LoginReceiver mLoginReceiver;

    private void onLoginStatusChanged() {
        if (FakeUserCenter.isLogin()) {
            mWebView.loadUrl("javascript:loginCallBack('" + FakeUserCenter.getId() + "','" + FakeUserCenter.getSSO_TOKEN() + "')");
        }
    }

    private void getWebData(final String requestUrl) {
        new Thread() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                Request request = new Request.Builder()
                        .url(requestUrl)
                        .build();
                try {
                    Response response = okHttpClient.newCall(request).execute();
                    final String data = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (!TextUtils.isEmpty(data)) {//页面销毁之后不做处理
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && !isDestroyed()) {
                                    //                          mWebView.loadData(data, "text/html; charset=UTF-8", null);
                                    mWebView.loadDataWithBaseURL(null, data, "text/html", "UTF-8", null);
                                }
                            }
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

}

猜你喜欢

转载自ccsosnfs.iteye.com/blog/2392592