AndroidはwebviewでJSとデータをやり取り


アンドロイドはwebviewを使用する過程でjsと通信することが多い.今回は以下のように簡単にまとめました.
一、jsは安卓端にデータを伝達する.
メインactivity、
public class MainActivity extends AppCompatActivity {
    private WebView mWebView;

   private String url = "http://wechat-dev.cb3dp.com/testwebview.html";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebView = findViewById(R.id.webview);
        initWebView();
    }

    private void initWebView() {
        WebSettings settings = mWebView.getSettings();

        //settings.setUseWideViewPort(true);//     webview   ,       ,       
        settings.setLoadWithOverviewMode(true);//  WebView            。
        mWebView.setVerticalScrollBarEnabled(false);//      
        mWebView.setHorizontalScrollBarEnabled(false);//      
        settings.setTextSize(WebSettings.TextSize.LARGEST);//    WebSettings,  HTML      
        settings.setJavaScriptCanOpenWindowsAutomatically(true);//    JS     
        //  WebView  ,    Javascript  
        mWebView.getSettings().setJavaScriptEnabled(true);//  js  
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.addJavascriptInterface(new AndroidJavaScript(getApplication()), "android");//  js  
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//        

//        mWebView.loadDataWithBaseURL(url, null, "text/html", "utf-8", null);

        mWebView.loadUrl(url);


    }


    /**
     * AndroidJavaScript
     *    h5     js ,        
     * returnAndroid   @JavascriptInterface      
     */
    private class AndroidJavaScript  {
        Context mContxt;

        public AndroidJavaScript (Context mContxt) {
            this.mContxt = mContxt;
        }

        @JavascriptInterface
        public void returnAndroid(String name) {//      APP,          HTML    
            if (name.isEmpty()||name.equals("")){
                return ;
            }
            Toast.makeText(getApplication(),name,Toast.LENGTH_SHORT).show();
            //       ///////////////////////
            //MainActivity       ,   
            Intent intent = new Intent(MainActivity.this, SecondActivity.class);
            intent.putExtra("name",name);
            startActivity(intent);
        }
    }

}

html,








アプリに るにはクリックしてください


主な方法は、js側がアンドロイド宣言を呼び出す方法、JavaScript:androidである.returnAndroid(「アプリへのデータを返す」)およびAndroid側が投げ出す方法は、具体的にはAndroid JavaScriptクラスを参照してください.
二、安卓端はjs端にデータを伝達する
主activity
public class SecondActivity extends AppCompatActivity {
    private TextView tv;
    private WebView mWebView;

//    @SuppressLint("JavascriptInterface")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        tv = findViewById(R.id.tv);

        mWebView = findViewById(R.id.webview);

        String name = getIntent().getStringExtra("name");
        if (!TextUtils.isEmpty(name)){
            tv.setText(name);
        }

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setSavePassword(false);
        webSettings.setSaveFormData(false);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(false);

        mWebView.setWebChromeClient(new MyWebChromeClient());

//        mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");

        mWebView.loadUrl("http://wechat-dev.cb3dp.com/testwebview2.html");

        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mWebView.loadUrl("javascript:javaCall('fasff')");
            }
        });
    }

    /**
     * Provides a hook for calling "alert" from javascript. Useful for
     * debugging your javascript.
     */
    final class MyWebChromeClient extends WebChromeClient {
        @Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            Log.d("TAG", message);
            result.confirm();

            tv.setText(message);
            return true;
        }
    }

}

html,
  






  
   
    function javaCall(str){  
		
       //lat = window.demo.GetLat(); 	
		alert("11111")
		document.getElementById("btn").value = str;
    }  
  
  



  
  

    
Click me!

これは上記より簡単です.js宣言方法だけで、アンドロイドが直接呼び出せばいいです.loadUrl("javascript:javaCall('fasff')");
プロジェクトのダウンロードアドレス