android webview常规及与h5交互,webview有效回收;

本文详细介绍了在Android应用中使用WebView的技巧,包括加载网页、处理网络变化、优雅地回收WebView资源等。文章还提供了如何在WebView中正确加载网页、处理不同网络情况下的缓存策略、实现WebView与JavaScript的交互,以及如何监听网络状态变化并做出响应。

	private LinearLayout layout_web;
    private WebView mWebView;
    
	layout_web=findViewById(R.id.layout_web);

	LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

   webView=findViewById(R.id.history_detail_webview);
        //        webView.loadUrl("https://www.hao123.com/");

        //加载网页时,只在webview中显示,如果不进行设置,加载网页时就会跳到浏览器进行页面显示;
        //加载本地html时,有无设置均在webview中显示
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

        webView.setLayoutParams(params);

        WebSettings webSettings=webView.getSettings();
        if (isNetworkAvailable(this)) {
            // 根据cache-control决定是否从网络上获取数据
            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        } else {
            // 没网,则从本地获取,即离线加载(原来打开过的网页,打开时会再次显示)
            webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

        webView.loadUrl("https://www.hao123.com/");

这篇文章比较详实
https://www.jianshu.com/p/0d6dd9f9594f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

跳转手机浏览器:

				Intent intent = new Intent();
                intent.setAction("android.intent.action.VIEW");
                Uri content_url = Uri.parse(Urltils.HostoryUrl+pointsMallEntities.get(position).getTranscation_hash());
                intent.setData(content_url);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);

查阅资料,手机上,网路改变的时候,系统都会发送广播通知,所以可以通过广播控件来捕捉改变,再改变的时候,获取一下网络状态,然后通过接口去完成相关操作,广播平时写得少,再写一下加深印象。


public class NetWorkBroadcastReciver extends BroadcastReceiver {
    private static final String TAG="NetWorkBroadcastReciver";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())){
            // do something
            Log.e(TAG, "onReceive: " +intent.getAction());
            Log.e(TAG, "onReceive getnetworkType: " +NetworkUtils.isAvailable(context));

        }
    }
}


//这个可以在最早的activity中或者application中进行注册

registerReceiver(this,new NetWorkBroadcastReciver());
//这里的new NetWorkBroadcastReciver,是接收到的广播,就是哪个广播的onReceive调用;

public static void registerReceiver(Context context,NetWorkBroadcastReciver broadcast){
        IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        context.registerReceiver( broadcast,intentFilter);
    }



交互及优雅回收webview:

public class WebViewActivity extends BaseActivity {

    private String url = "https://app-h5test.zhangxinzhixun.com/cleaning/ClearInstructions";
    private LinearLayout layout;
    private WebView webView;
    private String type;

    @Override
    public int layoutID() {
        return R.layout.activity_webview;
    }

    @Override
    public void init() {

        type=getIntent().getStringExtra("type");
        layout = findViewById(R.id.activity_webview_layout);
        initWebView();
        initTitle();
    }

    private void initWebView() {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        WebView webView = new WebView(this);
        //设置WebView的宽高
        webView.setLayoutParams(layoutParams);
        //把webView添加到容器中
        layout.addView(webView);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setLoadWithOverviewMode(true);
//        webView.getSettings().setDefaultFontSize(56);
        // webView.getSettings().setMinimumFontSize(40);//设置最小字体
        // 建议禁止缓存加载,以确保在攻击发生时可快速获取最新的滑动验证组件进行对抗。
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        // 设置不使用默认浏览器,而直接使用WebView组件加载页面。

        // 设置WebView组件支持加载JavaScript。
        webView.getSettings().setJavaScriptEnabled(true);
        // 建立JavaScript调用Java接口的桥梁。
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.addJavascriptInterface(new Contact() {
            @JavascriptInterface
            @Override
            public void getWechatApi() {
                JumpUtils.INSTANCE.getWechatApi();
            }
        }, "Android");
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        webView.loadUrl(url);
//        webView.loadDataWithBaseURL(null, url, "text/html", "utf-8", null);//解决乱码问题
    }

    @Override
    public void onClick(View view) {

    }

    private void initTitle() {
        TextView tv_title = findViewById(R.id.base_title_name);
        LinearLayout layout = findViewById(R.id.base_layout);
        View view = findViewById(R.id.base_view);
        ImageView img = findViewById(R.id.base_img_back);
        img.setVisibility(View.VISIBLE);
        img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onBackPressed();
            }
        });
        img.setBackgroundResource(0);
        img.setBackgroundResource(R.drawable.tt_lefterbackicon_titlebar_press);
//        view.setVisibility(View.GONE);

        if (type.equals("0")){
            tv_title.setText("微信专清");
        }else if (type.equals("1")){
            tv_title.setText("QQ专清");
        }
//            layout.setBackgroundResource(R.color.wchat_detail_green_color);
//            tv_title.setText("QQ专清");
//            layout.setBackgroundResource(R.color.wchat_detail_qq_blue_color);
//        tv_title.setTextColor(getResources().getColor(R.color.white));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (webView != null) {
            webView.clearView();
            webView.removeAllViews();
            webView.destroy();
            webView = null;
            layout.removeView(webView);
        }
    }

    interface Contact {
        //供html/JavaScript调用
        @JavascriptInterface
        void getWechatApi();
    }
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian11058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值