1. 程式人生 > >Android Studio 使用騰訊瀏覽服務(替換掉系統自帶的WebView)

Android Studio 使用騰訊瀏覽服務(替換掉系統自帶的WebView)

一、為何不直接使用內建的WebView元件?

用Android自帶的WebView元件,做過一些較複雜應用的人應該都會發現,這個自帶的元件很多時候真是讓人無力吐嘈,主要理由有二:

  1. Android中的WebView元件,記憶體洩漏的問題一直沒有非常有效的解決方案,讓程式猿們痛不欲生。
  2. Android中的WebView元件,在4.4以前的版本是WebKit的核心,4.4以後才換成chromium的核心,同時鑑於Google版本帝的風格,因此也導致各個版本之間的執行效率參差不齊。而且即使是chromium核心的版本,也因為要考慮相容以前的版本,而變得不是那麼美好。

也正因為如此,考慮到為了更好的體驗,以及避免後續可能帶來的更多麻煩,所以我試圖站在巨人的肩膀上,尋找一個第三方可靠的WebView元件。

二、Crosswalk與TBS服務

Crosswalk:據說各種流暢、強大,且Cordova在新的版本當中也將預設支援Crosswalk。具體的介紹可以參考:如何輕鬆搞定Crosswalk之嵌入模式

TBS服務:由騰訊QQ瀏覽器團隊出品。支援“共享X5核心模式”和“獨立下載X5核心模式”。具體可參考TBS騰訊瀏覽服務

在結合我的實際需求,綜合比較了上述兩套解決方案之後,最終我還是選擇了TBS服務,一是因為我不希望最終的APP體積突然增多了20M(Crosswalk需要整體打包進APP),另一方面是小馬哥的微信、手機QQ等APP在國內的裝機量實在是太高了,而且能夠支援以共享X5核心的方式,在自己的APP裡面直接呼叫微信或手機QQ的瀏覽服務,我認為未嘗不是一種好的解決方案。

三、最終實現

好吧,必須承認我很久沒有碰過Android了,所以因為一時的心血來潮,我選擇了Google主推的Android Studio來體驗,而不是以前習慣的Eclipse。這一下,就給自己找了個大麻煩,說多了都是淚……也只能自我安慰,我這是跟著時代與時俱進的成長了……

首先要說明的,Android Studio採用的是Gradle來構建專案,因此每一個專案都需要在國外的官網上下載對應版本的Gradle,由於眾所周知的原因,這個過程那真是相當之漫長。最可悲的是我一開始不知道,苦苦守候了半個多小時,介面一直卡在這一步,如下圖所示:


1.png

解決的方法很簡單,網上也有很多,例如換VPN、代理之類的,我採用了最簡單粗暴的方式。根據Android Studio的執行原理,每一個新建的專案,都會在C:\Users\Administrator.gradle\wrapper\dists\gradle-2.2.1-all目錄下建立一個加碼的資料夾,如下圖所示:


2.png

找到時間最接近的這個資料夾,然後將適先下載好的、對應版本的gradle檔案放裡面、並解壓,最終效果如下圖所示:


3.png

最後強制結束Android Studio並重啟,恭喜你,不出意外的話,這個時候專案檔案就可以順利並載入了!呃……如果要是出了意外的話,那……就只好繼續Google了……(別告訴我你不會翻牆~)

解決了上述問題之後,我們就可以正式開始進入編碼階段了。這裡推薦大家可以參考TBS提供的官方示例,如果嫌麻煩的話,可以簡單參考我下面的示例。

第一步,下載jar包,並載入到專案中,下載地址TBS——SDK下載

第二步,在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程式碼檔案中使用:

package net.ltpower.tbsapp;

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程式,應該就可以看到如下效果了:


4.png

那麼最關鍵的問題是,如何判斷已經成功接入了騰訊的X5核心瀏覽服務呢?辨別是否使用x5webview的方法:
顯示網頁文字時,可通過長按選擇文字的標識判斷,如下水滴狀選擇效果是x5webview 的標誌:


當然,上述的程式碼僅僅只是一個簡單的測試案例,實際的生產使用環境中還有很多需要考慮的地方,例如APP切換到後臺執行的資源的釋放等等。具體的實現方式,建議大家可以參考TBS官方的示例。

相關推薦

Android Studio 使用瀏覽服務替換系統WebView

一、為何不直接使用內建的WebView元件? 用Android自帶的WebView元件,做過一些較複雜應用的人應該都會發現,這個自帶的元件很多時候真是讓人無力吐嘈,主要理由有二: Android中的WebView元件,記憶體洩漏的問題一直沒有非常有效的解決方案,讓程式猿們痛不欲生。Android中的WebV

Android使用瀏覽服務X5核心

【前期準備】 騰訊X5 jar包下載地址 [點選開啟] 本次完整DEMO原始碼 [開啟Github] 【整合步驟】 第一步:下載jar包新增到專案 第二步:新增許可權 <uses-permission android:name="android.permission.WR

Android studio安裝】最新Android studio安裝教程以及問題emulator: ERROR: unknown virtual device name

安裝Android studio之前需要安裝JAVA,JAVA安裝教程網上很多本文不再陳述。可以參考連結: https://blog.csdn.net/u012934325/article/details/73441617/ 1、需要下載檔案 Android studio下載連結:ht

Android studio與github的使用多人開發原始碼同步問題

之前和朋友一起寫一個Android APP,程式碼不算難,只是要我們一起寫,這就出了一些程式碼合併上以及同步的問題。 今天講的主要是GitHub上分支保持與主幹原始碼同步的問題。 之前使用的時候就是專案掛在筆者的GitHub上,別人修改的程式碼提交一個pull reque

android輪播圖簡單實現左右無限滑動,動輪播

直接上程式碼了,都有註釋,原理很簡單 public class MainActivity extends AppCompatActivity { private static final String Tag = MainActivity.class.getSimpleName();

Android動畫基礎【2】——視覺動畫系統之透明度動畫

Android中檢視動畫系統: 和逐幀動畫不同的是,檢視動畫系統操作的物件是檢視物件。換句話說,檢視動畫系統可以讓例如文字框、按鈕、ImageView等動起來。 檢視動畫系統中所用的類所在包為: android.view.animation中。 其中包括的類有: Animation類

Android值Intent匹配規則挖掘PMS獲取系統apk資訊過程

Intent的查詢與匹配 App資訊表的構建 在Android開發中,Intent是極其重要的一個類,他是個個元件,程序之間通訊的紐帶,那麼系統是如何通過Intent來查詢對應的元件的呢? 在Android中,系統啟動之後就會註冊各種系統服務,關於註冊的這

Android彈出對話方塊--Alertdialog系統

一. 我們在平時做開發的時候,免不了會用到各種各樣的對話方塊,相信有過其他平臺開發經驗的朋友都會知道,大部分的平臺都只提供了幾個最簡單的實現,如果我們想實現自己特定需求的對話方塊,大家可能首先會想到,通過繼承等方式,重寫我們自己的對話方塊。當然,這也是不失為一個不錯的解決方

自學篇--使用keil5.23建立一個stm32工程並編譯韌體包版本

之前在本科學習階段學習過一點51微控制器的知識,可是因為基本沒有實踐過幾次現在已經完全忘記了。。前幾天老師突然丟給我幾個板子說讓我把程式編譯、燒寫環境裝好,當時我就震驚了,不過經過三四天的自我摸索,之後參考他人的學習經驗,現在已經基本能處理這個問題了,所以為了方便後面的學者

Android Studio 接入 飛 語音合成文字轉語音

1.下載相應的SDK(參考我上一篇文章:https://mp.csdn.net/postedit/83743563) 2.佈置資源 . 3.新增許可權 :在Application的根目錄下,為了可以訪問手機的一些功能 <!--連線網路許可權,用於執行雲端語音能力 -->

零程式碼三步快速整合移動分析MTAandroid

先來段正式的產品介紹: 騰訊移動分析有專業的移動應用資料分析能力,為您的應用提供實時資料統計分析服務,監控版本質量、渠道狀況、使用者畫像屬性及使用者細分行為,通過資料視覺化展現,協助產品運營決策。 說得簡單點,就是幾點 有很強大的實時處理能力,你只要上報

拋棄Androidwebview瀏覽器核心,使用X5服務webview瀏覽器

首先:下載騰訊X5服務所需的jar包,請戳這裡                 下載騰訊X5示例demo(安裝執行主要用於載入X5服務,安裝完成後,退出即可) 請戳這裡 其次:在Android工程的AndroidManifest.xml中申明騰訊X5服務所需的許可權。如

服務器突然遠程連不上包含ssh,拒絕訪問

img bsp 截圖 wid inf alt 雲服務 暫時 info 版權聲明:本文轉載自 https://blog.csdn.net/Alexwu555/article/details/78448113, 暫時這樣 , 以後再來整理。不太習慣不能直接貼截圖啊

服務框架-MSECspp-rpc

第一張:UML圖 (虛線表示基類) 不是我故意畫得那麼複雜,而是原本就那麼複雜。 核心class介紹: 兩個基類: CFrame:框架公共類,主要包括框架日誌物件、框架監控日誌物件、框架統計物件; CServerBase:伺服器程式基礎類,包含執行環境初始化

Android Studio之Activity切換動畫

文章 oid out size ref intel tar studio anim 1、上一篇文章“Android Studio之多個Activity的滑動切換(二)”中實現了多個activity之間的滑動切換,可是新切換出的activity大多是從右側進入 2、我們能

Android studio第一次使用配置gradle項目構建

令行 技術分享 簽名 aries rar 工具 img 引入 文章 1、gradle的概念 2、gradle配置jar包。和libs目錄導入jar包的差別 3、簽名打包: (1)Studio (2)命令行 (3)gradle wrap

服務器 設置ngxin + fastdfs +tomcat 開機啟動

tools.jar rtu .sh cal restart lin 權限 一個 catalina 在tomcat中新建一個可以啟動的 .sh 腳本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk

服務器 - 安裝redis3.2.9以及集群

分享 無法訪問 前臺 www 改密碼 log 後臺 to do 測試 redis大家都知道,服務器上必不可少的,那麽在生產環境下安裝的步驟和虛擬機裏也是差不多的 官網上最新穩定版是3.2.9,而4.0的更新比較大,但是比幾個還是beta版嘛 下載並且上傳壓縮包至雲服務

Android studio 百度地圖開發2地圖定位

gcj02 settings tick all adding ext tope wid erro Android studio 百度地圖開發(2)地圖定位 email:[email protected]/* */ 開發環境:win7 64位

NDK筆記-在Android Studio中使用ndk-build

路徑 width 能夠 jdk ide 代碼 目標 -1 adl 前面一篇我們接觸了CMake,這一篇寫寫關於ndk-build的使用過程。剛剛用到,想到哪兒寫哪兒。 環境背景 Android開發IDE版本:AndroidStudio 2.2以上版本(目前已經升級到2.