Android WebView:私はJavaScriptとどうやって打ち合わせましたか?
9947 ワード
今React Nativeはもう一年以上も燃えています.今はまだWebViewとJavaScriptのようなものがありますか?ははは、物事はいつも順を追って漸進して、その上今これはまだ主流の処理の方案でしょう、みんなはやはり理解する必要があって、文章はとても基礎、達人は軽く噴きます.
デモ
動図鎮楼、デモンストレーションの機能点の順序は:5-1-3-4
機能点動画のデモ
私たちが必要なHTMLページはどうやって作成しますか?
WebViewとJavaScriptの相互作用のスキルをゲットした時、この問題に対してめちゃくちゃに迫られました.彼のお母さんの私はフロントエンドではありません.すぐに自分の欲しいHTMLページを書くべきです.妾は本当にできません.
w 3 schoolは何ですか?
何ですか?どうして注文しないで入ってみますか?
私たちが必要なHTMLページ
w 3 schoolの簡単な教程によって、私達は私達の必要なページをかき集めることができます.
私たちが必要なHTMLページ
私たちが実現したい5つの機能 Android Native端末は、HTMLのjavascriptスクリプト を呼び出します. Android Native端末は、HTMLのjavascriptスクリプトを呼び出し、パラメータ を伝達する. HTMLのjavascriptスクリプトはAndroid Native端の関数 を呼び出します. HTMLのjavascriptスクリプトはAndroid Native端の関数を呼び出し、パラメータ を伝達する. HTMLのjavascriptスクリプトとAndroid NativeのJavaコードの完全なインタラクションフロー Android NativeからHTMLのjsスクリプトを呼び出します.
この例ではAndroid Native端のjavaコードはHTMLページのjsスクリプトを直接呼び出し、HTMLページのsubtitleを変更する機能を実現します.Android Nativeのコードは以下の通りです.
Android NativeからHTMLのjsスクリプトを呼び出してパラメータを転送します.
Android Nativeのコードは以下の通りです.
HTMLのjavascriptスクリプトはAndroid Native端の関数を呼び出します.
HTML対応のjs方法は:
HTML対応のjs方法は:
HTML対応のjs方法は:
Activityコード:
実はJavaScriptでJavaローカルメソッドを呼び出して、Googleの公式の実現方法はJavascript Interface方式を使うべきです.しかし、この方式はAndroid 4.2バージョンの前にセキュリティ・ホールがあり、興味を持ってここを見てください.Android 4.2バージョンの後に@Javascript Interfaceの注釈を入れて解決しました.Androidバージョンの破片化が深刻であることを考慮して、Javascript Interfaceを使うのは適していません.これも前の文章で効率の比較に入れていない原因です.
以上は完全なWebViewとJavaScriptの相互作用の例です.前の記事で紹介したShuldIntercept Request方式を自分で試してこの例を実現してみてください.
次の予告
Webviewページは最適化を展示しています.HTMLページの自分の最適化を除いて、Android Native端でロード速度のために何か最適化ができますか?次の文章は答えをあげます.例えば、公共Js方法の抽出は地元、JS、CSS、画像資源のプリロードなどです.
デモ
動図鎮楼、デモンストレーションの機能点の順序は:5-1-3-4
機能点動画のデモ
私たちが必要なHTMLページはどうやって作成しますか?
WebViewとJavaScriptの相互作用のスキルをゲットした時、この問題に対してめちゃくちゃに迫られました.彼のお母さんの私はフロントエンドではありません.すぐに自分の欲しいHTMLページを書くべきです.妾は本当にできません.
w 3 schoolは何ですか?
何ですか?どうして注文しないで入ってみますか?
私たちが必要なHTMLページ
w 3 schoolの簡単な教程によって、私達は私達の必要なページをかき集めることができます.
私たちが必要なHTMLページ
私たちが実現したい5つの機能
この例ではAndroid Native端のjavaコードはHTMLページのjsスクリプトを直接呼び出し、HTMLページのsubtitleを変更する機能を実現します.Android Nativeのコードは以下の通りです.
mCallJsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallJsWithArgsBtn.setText("Native WebView JS ");
mWebView.loadUrl("javascript:changeDemoSubtitle()");
}
});
HTML対応のjs方法は:function changeDemoSubtitle(){
document.getElementById("subtitle").innerHTML=" ";
)Android NativeからHTMLのjsスクリプトを呼び出してパラメータを転送します.
Android Nativeのコードは以下の通りです.
mCallJsWithArgsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallJsWithArgsBtn.setText(" :" + showDevInfo());
showDevInfoToH5();
}
});
private String showDevInfo() {
return "showDevInfo(' :" + android.os.Build.MODEL +
",SDK :" + android.os.Build.VERSION.SDK +
", :" + android.os.Build.VERSION.RELEASE + "')";
}
private void showDevInfoToH5() {
mWebView.loadUrl("javascript:" + showDevInfo());
}
HTML対応のjs方法は:function showDevInfo(info){
document.getElementById("subtitle").innerHTML=info;
)HTMLのjavascriptスクリプトはAndroid Native端の関数を呼び出します.
HTML対応のjs方法は:
function disp_confirm(){
confirm();
}
Android Nativeのコードは以下の通りです.mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
Toast.makeText(MainActivity2.this, "Android_Native_Toast!", Toast.LENGTH_SHORT).show();
}
result.confirm();
return true;
}
});
HTMLのjavascriptスクリプトはAndroid Native端の関数を呼び出してパラメータを伝えます.HTML対応のjs方法は:
function disp_confirm_with_args(message){
confirm(message);
}
Android Nativeのコードは以下の通りです.mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
Toast.makeText(MainActivity2.this, "Android_Native_Toast! message:" + message, Toast.LENGTH_SHORT).show();
}
result.confirm();
return true;
}
});
HTMLのjavascriptスクリプトとAndroid NativeエンドのJavaコードの完全なインタラクションの流れHTML対応のjs方法は:
function disp_confirm_with_args(message){
confirm(message);
}
Android Nativeのコードは以下の通りです.mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
if ("getDevInfo".equals(message)) {
showDevInfoToH5();
}
}
result.confirm();
return true;
}
});
private String showDevInfo() {
return "showDevInfo(' :" + android.os.Build.MODEL +
",SDK :" + android.os.Build.VERSION.SDK +
", :" + android.os.Build.VERSION.RELEASE + "')";
}
private void showDevInfoToH5() {
mWebView.loadUrl("javascript:" + showDevInfo());
}
Android Nativeエンドコードの完全な展示:Activityコード:
package cn.mtalks.jsbridgedemo;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity2 extends Activity {
private WebView mWebView;
private Button mCallJsBtn;
private Button mCallJsWithArgsBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_2);
initView();
initWebView();
}
private void initView() {
mWebView = (WebView) findViewById(R.id.webview);
mCallJsBtn = (Button) findViewById(R.id.call_js_without_args_btn);
mCallJsWithArgsBtn = (Button) findViewById(R.id.call_js_with_args_btn);
mCallJsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallJsWithArgsBtn.setText("Native WebView JS ");
mWebView.loadUrl("javascript:changeDemoSubtitle()");
}
});
mCallJsWithArgsBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCallJsWithArgsBtn.setText(" :" + showDevInfo());
showDevInfoToH5();
}
});
}
private void initWebView() {
// JavaScript
mWebView.getSettings().setJavaScriptEnabled(true);
// html
mWebView.loadUrl("file:///android_asset/JsDemo.html");
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
if ("getDevInfo".equals(message)) {
showDevInfoToH5();
} else if (TextUtils.isEmpty(message)) {
Toast.makeText(MainActivity2.this, "Android_Native_Toast!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity2.this, "Android_Native_Toast! message:" + message, Toast.LENGTH_SHORT).show();
}
// H5 ,
result.confirm();
// true, H5 confirm 。
return true;
}
});
}
private String showDevInfo() {
return "showDevInfo(' :" + android.os.Build.MODEL +
",SDK :" + android.os.Build.VERSION.SDK +
", :" + android.os.Build.VERSION.RELEASE + "')";
}
private void showDevInfoToH5() {
mWebView.loadUrl("javascript:" + showDevInfo());
}
}
XMLコード
AndroidManifest 文件
友情のヒント実はJavaScriptでJavaローカルメソッドを呼び出して、Googleの公式の実現方法はJavascript Interface方式を使うべきです.しかし、この方式はAndroid 4.2バージョンの前にセキュリティ・ホールがあり、興味を持ってここを見てください.Android 4.2バージョンの後に@Javascript Interfaceの注釈を入れて解決しました.Androidバージョンの破片化が深刻であることを考慮して、Javascript Interfaceを使うのは適していません.これも前の文章で効率の比較に入れていない原因です.
以上は完全なWebViewとJavaScriptの相互作用の例です.前の記事で紹介したShuldIntercept Request方式を自分で試してこの例を実現してみてください.
次の予告
Webviewページは最適化を展示しています.HTMLページの自分の最適化を除いて、Android Native端でロード速度のために何か最適化ができますか?次の文章は答えをあげます.例えば、公共Js方法の抽出は地元、JS、CSS、画像資源のプリロードなどです.