Android:javaとjavascriptはお互いに呼出します.

11755 ワード

一:WebViewの簡単な理解
1.基本的に最も重要なのは、Android Manifest.xmlにアクセス権限を追加しなければならないことです.
 android:name=「android.permission.INTERNET」 />
2.訪問ページにJavascriptがあれば、WebViewはJavascriptをサポートするように設定しなければなりません.そうでなければ、下のページは全部無駄遣いです.
WebView.getSettings().setJavaScriptEnabled(true);   
3.もしページのリンクをクリックしたいなら、リンクをクリックして現在のbrowserの中で応答し続けてほしいです.Androidを新しくオープンしたシステムbrowserの中ではなく、リンクすべきことがあります.WebViewのWebViewCientオブジェクトをカバーしなければなりません.
mWebView.setWebViewClient(new WebViewClient(){
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        view.loadUrl(url);
        return true;
    }
});
4.何の処理もしないなら、ウェブページを閲覧し、システム「Back」ボタンをクリックして、全体のBrowserはfinishを呼び出して自分を終了します.ブラウザーを起動するのではなく、ブラウザーを立ち上げるのであれば、現在のActivityでこのBackイベントを処理して消費する必要があります.
方式1:比較的古い方式ですので、使うことを勧めません.
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {
        mWebView.goBack();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}
方式2:Activityには物理戻りキーの傍受イベントがあります.直接使用できます.
@Override
public void onBackPressed() {
    if(web_view.canGoBack()){
        web_view.goBack();
        return;
    }else{
        this.finish();
    }
}
二:Android原生とJSの相互作用が正式に始まります.
注意:
有名になって久しい任意の命令は、脆弱性を実行し、addJavascript Interface方法によって、JsはJavaオブジェクト方法を呼び出すことができ、反射メカニズムによって、Jsは直接にRuntimeを取得し、任意のコマンドを実行することができます.Android 4.2以上は、文@Javascript Interfaceを通じて安全性を保証できます.Android 4.2の前にaddjavascript interfaceを使用してオリジナルのJavaに注入し、JavaScriptに呼び出すことができますが、このような案は一定のセキュリティリスクがあります.詳しくは、WebViewの中には携帯電話との接続が隠れています.「とにかく4.2以下の携帯はほとんどないので、ここでは知るしかないです.」
1.JS呼び出しJava方法:
呼び出しフォーマットはwindow.js InterfaceName.methodNameです.この例では、注入インターフェース名としてredを使っています.
MainActivityコード:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    web_view = (WebView) findViewById(R.id.content_web_view);
    web_view.getSettings().setJavaScriptEnabled(true);//    js
    web_view.loadUrl("www.google.com");//  html
    web_view.addJavascriptInterface(new RedJavascriptInterface(), "red");//     js  
}

public final class RedJavascriptInterface {
    //@JavascriptInterface    ,  Android      js   
    @JavascriptInterface
    public void closeActivity() {
        //JS     
        Activity.this.finish();
    }

    /**
     * *      js Java  
     * *  bookingNum:    
     **/
    @JavascriptInterface
    public void callToBooking(String bookingNum) {
        //         
        Uri uri = Uri.parse("tel:" + bookingNum);
        Intent dialIntent = new Intent(Intent.ACTION_DIAL, uri);
        startActivity(dialIntent);
    }

    /**
     * *      java js  
     * *              
     **/
    @JavascriptInterface
    public String findLocation() throws JSONException {
        JSONObject obj = new JSONObject();
        obj.put("lat", currentLat + "");
        obj.put("lng", currentLon + "");
        obj.put("regionName", regionName);
        obj.put("location", location);

        JSONObject object = new JSONObject();
        object.put("res_code", "1");
        object.put("res_message", obj);
        return object.toString();
    }
}
index.コード:
"text/javascript"</span>>
function back(){
    window.red. closeActivity()<span style="color:#cc7832;">;
</span>}
function call(){
    window.red. callToBooking(<span style="color:#6a8759;">"13218615698"</span>)<span style="color:#cc7832;">;
</span>}
var locationStr = window.red. findLocation()<span style="color:#cc7832;">;</span><span style="color:#808080;">//          ,  js                     !!
</span>
2.Java Jsメソッドを呼び出す:
Javaはjsを呼び出す時、WebView.loadUrl()の方法を使って、直接HTMLページの中でJavaScriptの方法を実行することができます.
MainActivityコード:
// java   js   ,      
public void sendInfoToJs1() {
    webView.loadUrl("javascript:sayHello()");
}

// java   js   ,      
public void sendInfoToJs2(String str) {
    //  js    :showInfoFromJava(msg)  
    webView.loadUrl("javascript:showInfoFromJava('" + str + "')");
}

private void testEvaluateJavascript(WebView webView) {
    webView.evaluateJavascript("getGreetings()", new ValueCallback() {

        @Override
        public void onReceiveValue(String value) {
            Log.i(LOGTAG, "onReceiveValue value=" + value);
        }
    });
}
index.コード:
"text/javascript"</span>>
function sayHello() {
    alert(<span style="color:#6a8759;">"Hello"</span>)
}

function showInfoFromJava(msg){
    alert(<span style="color:#6a8759;">"        :"</span>+msg)<span style="color:#cc7832;">;
</span>}

function getGreetings() {
    <span style="color:#cc7832;">return </span><span style="color:#6897bb;">1</span><span style="color:#cc7832;">;
</span>}
やっと整理が終わりました.整理してから自分の頭もはっきりしました.使うたびにgoogleを導出しなくてもいいです.iOSと共同開発した原因かもしれません.このような知識で、いつも混同しています.
知らない仲間に助けてもらいたい!!!
関連資料リンク:
1.WebViewを深く説明する——上  
2.Androidのwebviewは、jsを通じてjavaメソッドを呼び出します.
3.Android Webview JavaとJavascriptのセキュリティインタラクション+Android:javaとjavascriptはお互いに呼応します.【安全問題の解説がやや多く、重要なのもこの招待状の中で体現しています.】
4.AndroidではJavaとJavaScriptがインタラクティブである【説明のほうが分かりやすい】
5.androidソフトウェア開発のwebView.addJavascript Interface循環は漸進的に【一】【解説が多いですが、実はこのスレッドにはすでに含まれています.しかし、本人が接触したばかりの時には、やはり多くの収穫をもたらしてくれます.ここで備考してください.】