這篇算是一個隨筆記錄吧,最近寫了一個簡單的js,并要與原生進行交互,之前只知道如何與js交互,但不知道js側(cè)是如何寫的,這次兩端一起寫,了解到了他們是如何交互。
先說下這次的需求吧:
H5界面負責(zé)展示一個邀請用戶入群的功能,H5界面有兩個按鈕,第一個按鈕是復(fù)制微信號功能,點擊第二個按鈕可以打開微信。

這個動圖是最后效果:

說一下這個是怎么做的吧:
1.當我進入這個頁面的時候,原生就已經(jīng)知道這個微信號了

js端有個<a/>標簽,當我點擊的時候,就可以拿到URL
此時只要我和原生商量好跳轉(zhuǎn)鏈接以及相應(yīng)參數(shù)就可以拿到微信號
Uri uri = Uri.parse(url);
Set<String> names = uri.getQueryParameterNames();
if (url.contains("qqqq")) {
String did = uri.getQueryParameter("qqqq"); //did=mai456mai456
}
2.原生負責(zé)復(fù)制功能(js端也可以做這個事兒,按你習(xí)慣來就好)
//復(fù)制功能
public static void copyText(Context context,String linkUrl) {
ClipboardManager clipboardManager = (ClipboardManager)context.getSystemService(Context.CLIPBOARD_SERVICE);
clipboardManager.setPrimaryClip(ClipData.newPlainText(null, linkUrl));
}
這里多說一句,SDK11之前請使用android.text.ClipboardManager ,SDK11起android.text.ClipboardManager被廢棄,使用它的子類android.content.ClipboardManager替代,同樣被廢棄還有setText/getText/hasText方法,使用setPrimaryClip/getPrimaryClip/hasPrimaryClip替代
3.原生負責(zé)打開微信(關(guān)于js端打開微信這個事兒,我咨詢過一位js界德高望重端前輩,前輩跟我說,微信只和幾個友商開展了互通的業(yè)務(wù),所以,js打開微信不太方便)
//打開微信
public static void openWechat(Activity activity) {
Intent intent = new Intent();
ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI");// 報名該有activity
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(cmp);
activity.startActivityForResult(intent, 0);
}
再說一些常用webview與js交互常用方法,以下代碼塊兒是集成webview的子類:
getSettings().setJavaScriptEnabled(true); // 設(shè)置與Js交互的權(quán)限
getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);//關(guān)閉webview中緩存
getSettings().setUseWideViewPort(true);/將圖片調(diào)整到適合webview的大小
getSettings().setLoadWithOverviewMode(true);// 縮放至屏幕的大小
getSettings().setDefaultTextEncodingName("UTF-8");//編碼方式
getSettings().setJavaScriptCanOpenWindowsAutomatically(true); // 設(shè)置允許JS彈窗
setWebChromeClient(new WebChromeClient());
setVerticalScrollBarEnabled(false);
//復(fù)寫shouldOverrideUrlLoading()方法,使得打開網(wǎng)頁時不調(diào)用系統(tǒng)瀏覽器, 而是在本W(wǎng)ebView中顯示
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
//開始載入頁面調(diào)用的,我們可以設(shè)定一個loading的頁面,告訴用戶程序在等待網(wǎng)絡(luò)響應(yīng)。
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//設(shè)定加載開始的操作
}
});
//在頁面加載結(jié)束時調(diào)用。我們可以關(guān)閉loading 條,切換程序動作。
webView.setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
//設(shè)定加載結(jié)束的操作
}
});
}
說一點我寫js的入門的心路歷程吧:
剛開始弄的時候,我只知道原生加載URL,所以每次修改完文件,我就把寫好的html文件傳到七牛上,后來我發(fā)現(xiàn)這樣太麻煩了,我就尋思搭個本地服務(wù)器,這樣每次都連自己的服務(wù)器,修改能快點。我就上網(wǎng)找到了一個現(xiàn)成的,這種網(wǎng)上有很多,感謝~傳送門,連上服務(wù)器之后就感覺進城了,挺好的。
后來,我又發(fā)現(xiàn)一個問題,我那兩個按鈕在不同手機上位置不一樣,我又問了問,知道了css里的單位,px,vh,rem什么的,是需要適配不同的android手機的。
通過這次試水,知道了html端有很多節(jié)點,原生端是直接可以拿到的,如: title,url等等。雖然功能不難,但對webview了解更深入了一些。
大家有什么問題,歡迎私信,一起交流~