项目要求,在一个网页中跳转Activity,作为一个成长中的小白鼠,我以为实现不了,后台的哥们告诉我可以在H5页面中调用JS实现Activity跳转,经过一天的研究,终于实现了,拿来与大家分享一下
WebView的使用请戳我之前写的博客:http://blog.csdn.net/sinat_16458039/article/details/49494525
1.首先我要写一段html代码,在代码中加入JS,把这个网页放入assets目录下
<!DOCTYPE HTML>
<html>
<head>
<title>Android与js交互</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=yes" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
function show(info){
}
</script>
</head>
<body>
<b>测试</b>
<br />
<button onClick="window.hello.javaMethod('param')">启动 Activity</button>
<br />
</body>
</html>
2.WebView支持JS需要加入以下代码:
webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new JSHook(), "hello"); //在JSHook类里实现javascript想调用的方法,并将其实例化传入webview, "hello"这个字串告诉javascript调用哪个实例的方法JSHook():
public class JSHook{
public void javaMethod(String p){
Log.d(tag , "JSHook.JavaMethod() called! + "+p);
<span style="white-space:pre"> Intent intent = new Intent(WebViewActivity.this,</span>MainActivity<span style="white-space:pre">.class);
<span style="white-space:pre"> </span>startActivity(intent);</span>
}
}
3.完整java代码:
public class WebViewActivity extends ActionBarActivity {
private static final String URL = "file:///android_asset/helloworld.html";
private WebView webView;
public String tag = "MainActivity";
private Context mContext;
@SuppressLint("JavascriptInterface")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
// 进行全屏
mContext = this;
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
webView = (WebView) this.findViewById(R.id.wv);
webView.loadUrl(URL);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSHook(), "hello");
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d(tag, " url:"+url);
view.loadUrl(url);// 当打开新链接时,使用当前的 WebView,不会使用系统其他浏览器
return true;
}
});
}
public class JSHook{
@JavascriptInterface
public void javaMethod(String p){
Log.d(tag , "JSHook.JavaMethod() called! + "+p);
Intent intent = new Intent(WebViewActivity.this,MainActivity.class);
startActivity(intent);
}
}
@Override
//设置回退
//覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack(); //goBack()表示返回WebView的上一页面
this.finish();
return true;
}
return false; }
}
4.注意 在js调用方法上面加注解@JavascriptInterface
此篇博客参考了以下文章进行整理,感谢原作者: http://www.cnblogs.com/lovemo1314/p/4634895.html