Android Studio 使用騰訊瀏覽服務(替換掉系統自帶的WebView)
一、為何不直接使用內建的WebView元件?
用Android自帶的WebView元件,做過一些較複雜應用的人應該都會發現,這個自帶的元件很多時候真是讓人無力吐嘈,主要理由有二:
- Android中的WebView元件,記憶體洩漏的問題一直沒有非常有效的解決方案,讓程式猿們痛不欲生。
- 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的根目錄下,為了可以訪問手機的一些功能 <!--連線網路許可權,用於執行雲端語音能力 -->
零程式碼三步快速整合騰訊移動分析(MTA)(android)
先來段正式的產品介紹: 騰訊移動分析有專業的移動應用資料分析能力,為您的應用提供實時資料統計分析服務,監控版本質量、渠道狀況、使用者畫像屬性及使用者細分行為,通過資料視覺化展現,協助產品運營決策。 說得簡單點,就是幾點 有很強大的實時處理能力,你只要上報
拋棄Android自帶webview瀏覽器核心,使用騰訊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, 暫時這樣 , 以後再來整理。不太習慣不能直接貼截圖啊
騰訊微服務框架-MSEC(spp-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.