天天看點

android原生和h5互動

一:非內建,元件嵌套h5頁面

(1)layout在頁面添加webview元件;

(2) webView.loadUrl(“file:///android_asset/apps/oneapp/www/plus/nativeui.html”);//載入h5頁面

(3)直接載入的h5**,js失效**需要原生開放權限

webView.getSettings().setJavaScriptEnabled(true);

webView.getSettings().setJavaScriptEnabled(true);

webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

因為某些不知道都原因,即使加了以上代碼,js裡面的alert依然不能被調用:

webView.setWebChromeClient(new WebChromeClient()); //js彈出框載體

(4)h5頁面的a連結也會失效:

///激活h5頁面的a連結

webView.setWebViewClient(new WebViewClient(){

@SuppressLint(“MissingPermission”)

@Override

public boolean shouldOverrideUrlLoading

(WebView view, String url) {

Log.i(“使用者單擊超連接配接”, url);

//判斷使用者單擊的是那個超連接配接

String tag=“tada:tel”;

if (url.contains(tag))

{

String mobile=url.substring(url.lastIndexOf("/")+1);

Uri uri=Uri.parse(“tel:”+mobile);

Intent intent=new Intent(Intent.ACTION_CALL,uri);

startActivity(intent);

//這個超連接配接,java已經處理了,webview不要處理了

return true;

}

return super.shouldOverrideUrlLoading(view, url);

}

});

以上操作之後,雖然h5嵌套在webview裡邊,h5和android的互動:

原生頁面跳轉嵌套h5頁面的webview原生頁面:

btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent(one.this, MainActivity.class);

//用Bundle攜帶資料

Bundle bundle=new Bundle();

bundle.putString(“name”, “11”);//可以用這種傳值但是我取值失敗了是以換了種方法

bundle.putInt(“id”, 1);

intent.putExtras(bundle);

startActivity(intent);

}

});

//嵌套h5頁面的webview定義一個方法,并由h5調用方法

webView.addJavascriptInterface(new JsInteration(), “android”);//給js暴露方法,通過方法傳輸給h5

public class JsInteration {

@JavascriptInterface

public String back() {

return MainActivity.this.getIntent().getExtras().getString(“name”);//MainActivity目前檔案名

( MainActivity.this.getIntent().getExtras().getInt(“id”)取不到,但是應該是取到的,應該是哪裡寫錯了吧!)

}

}

//js裡面去調用該定義的方法

showInfoFromJava();

function showInfoFromJava(){

var result =window.android.back();//android是java中定義的name,back()是調用的方法名

document.getElementById(“p”).innerHTML=result

}

前面說到傳值取不到的我用了另外一種方法,可以取到;

btn2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent(one.this,SDK_WebView.class);//跳轉h5并傳值

intent.putExtra(“name”,“file:///android_asset/apps/HelloH5/www/plus/camera.html”);

intent.putExtra(“age”,“1”);//傳遞參數

startActivity(intent);

}

});

//webview中定義方法

//h5調用方法接受參數

public class JsInteration {

@JavascriptInterface//。。。。。。。

public String back() {

return SDK_WebView.this.getIntent().getStringExtra(“age”);

}

@JavascriptInterface//每個被定義的方法都需要加這一句

public String go() {

return SDK_WebView.this.getIntent().getStringExtra(“name”);

}

}

//js調用和前面是一緻的window.android.back()/window.android.go();

H5頁面跳轉到原生需要在webview加入:

webView.addJavascriptInterface(this, “nativeMethod”);

@JavascriptInterface

public void toActivity(String toActivity) {

//此處應該定義常量對應,同時提供給web頁面編寫者

if(TextUtils.equals(toActivity, “a”)){

Intent intent = new Intent(this, two.class);//two是即将跳轉的原生頁面

//用Bundle攜帶資料

Bundle bundle=new Bundle();

//傳遞name參數為tinyphp

bundle.putString(“name”,toActivity);

intent.putExtras(bundle);

startActivity(intent);

}else{

Intent intent = new Intent(this, three.class);

//用Bundle攜帶資料

Bundle bundle=new Bundle();

//傳遞name參數為tinyphp

bundle.putString(“name”, “我是傳過來參數name”);

intent.putExtras(bundle);

startActivity(intent);

}

}

h5有onclick事件:gotoActivity (a)/gotoActivity (b)

function gotoActivity (activity) {

nativeMethod.toActivity(activity);

}

實體傳回鍵監聽://webview頁面監聽傳回上一層,h5傳回注釋

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if ((keyCode == KeyEvent.KEYCODE_BACK) &&webView.canGoBack()) {

webView.goBack();

return true;

}

return super.onKeyDown(keyCode, event);

}