微信号:ardays

介绍:android每日绝对干货

还在用Android自带的WebView组件?太Out了!

2016-08-30 20:41 Android每日干货

为何不直接使用内置的WebView组件?

        用Android自带的WebView组件,做过一些较复杂应用的人应该都会发现,这个自带的组件很多时候真是让人无力吐嘈,主要理由有二:

        Android中的WebView组件,内存泄漏的问题一直没有非常有效的解决方案,让程序猿们痛不欲生。

        Android中的WebView组件,在4.4以前的版本是WebKit的内核,4.4以后才换成chromium的内核,同时鉴于Google版本帝的风格,因此也导致各个版本之间的运行效率参差不齐。而且即使是chromium内核的版本,也因为要考虑兼容以前的版本,而变得不是那么美好。

        也正因为如此,考虑到为了更好的体验,以及避免后续可能带来的更多麻烦,所以我试图站在巨人的肩膀上,寻找一个第三方可靠的WebView组件。



使用方法

        第一步,下载jar包,并加载到项目中,

       下载地址:http://x5.tencent.com/doc?id=1004


        

        第二步,在xml布局中加入腾讯自定义的WebView。

        <com.tencent.smtt.sdk.WebView  

            android:id="@+id/tbsContent"  

            android:layout_width="match_parent"  

            android:layout_height="match_parent"/>


        第三步,申请腾讯X5所需权限。

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

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

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

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

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


        第四步,在Activity代码文件中使用:

        import android.graphics.PixelFormat;

        import android.support.v7.app.ActionBarActivity;

        import android.os.Bundle;

        import android.view.KeyEvent;

        import android.view.Menu;

        import android.view.MenuItem;

        import android.view.WindowManager;

        import android.widget.LinearLayout;

        import android.widget.RelativeLayout;

        import android.widget.TextView;

        

        import com.tencent.smtt.sdk.QbSdk;

        import com.tencent.smtt.sdk.WebSettings;

        import com.tencent.smtt.sdk.WebView;

        import com.tencent.smtt.sdk.WebViewClient;

        

        

        public class MainActivity extends ActionBarActivity {

        

            com.tencent.smtt.sdk.WebView tbsContent;

            private String url = "http://www.91suke.com/s/b9271044";

        

            @Override

            protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

        

                getWindow().setFormat(PixelFormat.TRANSLUCENT);

                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

                initView();

            }

        

            private void initView() {

                tbsContent = (com.tencent.smtt.sdk.WebView)findViewById(R.id.tbsContent);

                tbsContent.loadUrl(url);

                WebSettings webSettings = tbsContent.getSettings();

                webSettings.setJavaScriptEnabled(true);

                tbsContent.setWebViewClient(new WebViewClient() {

                    @Override

                    public boolean shouldOverrideUrlLoading(WebView view, String url) {

                        view.loadUrl(url);

                        return true;

                    }

                });

            }

        

            @Override

            public boolean onKeyDown(int keyCode, KeyEvent event) {

                if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) {

                    tbsContent.goBack();

                    return true;

                }

                return super.onKeyDown(keyCode, event);

            }

        

            @Override

            public boolean onCreateOptionsMenu(Menu menu) {

                // Inflate the menu; this adds items to the action bar if it is present.

                getMenuInflater().inflate(R.menu.menu_main, menu);

                return true;

            }

        

            @Override

            public boolean onOptionsItemSelected(MenuItem item) {

                // Handle action bar item clicks here. The action bar will

                // automatically handle clicks on the Home/Up button, so long

                // as you specify a parent activity in AndroidManifest.xml.

                int id = item.getItemId();

        

                //noinspection SimplifiableIfStatement

                if (id == R.id.action_settings) {

                    return true;

                }

        

                return super.onOptionsItemSelected(item);

            }

        }

        



好了,到这一步,连接真机,运行你的Android程序,应该就可以看到如下效果了:


        那么最关键的问题是,如何判断已经成功接入了腾讯的X5内核浏览服务呢?辨别是否使用x5webview的方法:

        显示网页文字时,可通过长按选择文字的标识判断,如下水滴状选择效果是x5webview 的标志:



        当然,上述的代码仅仅只是一个简单的测试案例,实际的生产使用环境中还有很多需要考虑的地方,例如APP切换到后台运行的资源的释放等等。具体的实现方式,建议大家可以参考TBS官方的示例。


 今天的干货就到这里了,每天有各种干货等着你.各种实用的Demo等着你下载。喜欢的用户可以长按下图的二维码进行关注哦.



 
Android每日干货 更多文章 Activity切换淡入淡出效果 想要视频,demo的小伙伴看这里啊~ 5步搞定android混淆 仿QQ5.0左侧滑功能 Android防微信首页左右滑动切换
猜您喜欢 React Native 热加载(Hot Reload)原理简介 教你使用设计支持库:BottomSheets spring boot系列3:开发web应用 Github干货铺:django-webpack-loader 吉林说R系列第二篇:如何进行数据读写