Android Studio的Java程序如何打开网页并获取返回值

Android Studio的Java程序如何打开网页并获取返回值,第1张

protected void onCreate(Bundle savedInstanceState)

{

x = (WebView)thisfindViewById(RidwebView_viewTable);

xsetScrollBarStyle(ViewSCROLLBARS_INSIDE_OVERLAY);

xgetSettings()setBuiltInZoomControls(true);

xgetSettings()setJavaScriptEnabled(true);

xaddJavascriptInterface(new JsToJava(), "stub"); //JsToJava是内部类,代码在后面。stub是接口名字。

//xloadUrl(">

在Android的开发过程中、遇到一个新需求、那就是让Java代码和Javascript代码进行交互、在IOS中实现起来很麻烦、而在Android中相对来说容易、Android对这种交互进行很好的封装、其实可以很简单的用Java代码调用WebView中的js函数、也可以用WebView中的js来调用Android应用中的Java代码

一、网页的JS代码调用ANDROID中JAVA代码的方法

在网页中调用java代码、需要在webview控件中添加javascriptInterface

contentWebView = (WebView) findViewById(Ridwebview);

//启用javascript

contentWebViewgetSettings()setJavaScriptEnabled(true);

contentWebViewaddJavascriptInterface(this, "js对象名");

在Activity中定义一个要被js调用的方法、src为js传递过来的参数、如果没有不传也可以的。

public void jsFunction(final String str) {

ToastmakeText(this, str, ToastLENGTH_SHORT)show();

runOnUiThread(new Runnable() {

@Override

public void run() {

//在里对Android应用的UI进行处理

}

});

}

在网页中、只需要像调用js方法一样、进行调用就可以

<a onClick="windowjs对象名jsFunction(´hello world´)" >

点击调用java代码并传递参数

</a>

二、ANDROID中JAVA代码调用网页的JS代码的方法

Java代码调用js并传参其实是通过WebView的loadUrl方法去调用的、只是参数url的写法不一样

// 无参数调用

contentWebViewloadUrl("javascript:javacalljs()");

// 传递参数调用

contentWebViewloadUrl("javascript:javacalljswithargs("

+ "´hello world´" + ")");

三、JAVA和JS交互注意事项

1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法

2、Java 调用 js 的函数、没有返回值、调用就控制不到

3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间

4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验

在Cocos2d-js 30beta中加入了一个新特性,在Android平台上我们可以通过反射直接在js中调用Java的静态方法。使用方法很简单:

在callStaticMethod方法中,通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回值。下面介绍的类名和方法签名可能会有一点奇怪,但是Java的规范就是如此的。

(1)类名

参数中的类名必须是包含Java包路径的完整类名,例如在orgcocos2dxJavaScript这个包下面写了一个Test类:

那么这个Test类的完整类名应该是org/cocos2dx/javascript/Test,注意这里必须是斜线/,而不是在Java代码中习惯的点。

(2)方法名

方法名很简单,就是方法本来的名字,例如sum方法的名字就是sum。

(3)方法签名

方法签名稍微有一点复杂,最简单的方法签名是()V,表示一个没有参数没有返回值的方法。其他一些例子:

(I)V表示参数为一个int,没有返回值的方法;

(I)I表示参数为一个int,返回值为int的方法;

(IF)Z表示参数为一个int和一个float,返回值为boolean的方法;

现在有一些理解了吧,括号内的符号表示参数类型,括号后面的符号表示返回值类型。因为Java是允许函数重载的,可以有多个方法名相同但是参数返回值不同的方法,方法签名正是用来帮助区分这些相同名字的方法的。

(4)参数

参数可以是0个或任意多个,直接使用js中的number,bool和string就可以。

(5)使用示例

将会调用上面的Test类中的静态方法:

//调用hello方法

jsbreflectioncallStaticMethod("org/cocos2dx/javascript/Test", "hello", "(Ljava/lang/String)V", "this is a message from js");

//调用第一个sum方法

var result = jsbreflectioncallStaticMethod("org/cocos2dx/javascript/Test", "sum", "(II)I", 3, 7);

cclog(result); //10

//调用第二个sum方法

var result = jsbreflectioncallStaticMethod("org/cocos2dx/javascript/Test", "sum", "(I)I", 3);

cclog(result); //5

(6)注意

另外有一点需要注意的就是,在android应用中,cocos的渲染和js的逻辑是在gl线程中进行的,而android本身的UI更新是在app的ui线程进行的,所以如果在js中调用的Java方法有任何刷新UI的 *** 作,都需要在ui线程进行。

例如,在下面的例子中会调用一个Java方法,d出一个android的Alert对话框。

//给我们熟悉的AppActivity类稍微加点东西

public class AppActivity extends Cocos2dxActivity {

private static AppActivity app = null;

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

app = this;

}

public static void showAlertDialog(final String title,final String message) {

//这里一定要使用runOnUiThread

apprunOnUiThread(new Runnable() {

@Override

public void run() {

AlertDialog alertDialog = new AlertDialogBuilder(app)create();

alertDialogsetTitle(title);

alertDialogsetMessage(message);

alertDialogsetIcon(Rdrawableicon);

alertDialogshow();

}

});

}

}

在js中调用

jsbreflectioncallStaticMethod("org/cocos2dx/javascript/AppActivity", "showAlertDialog", "(Ljava/lang/String;Ljava/lang/String;)V", "title", "hahahahha");

这样调用就可以看到一个android原生的Alert对话框了。

function getAvg(res) {

res = JSONparse(res);

if (rescode == 401) {

apptokenFailed();

return;

}

if (rescode == 500) {

appbusNone();

return;

}}

以上js的写法 apptokenFailed()是JS调用Android的方法,下面的接口类的写法

class WebAppInterface {

public Context mContext;

public WebAPPInterface(Context context) {

thismContext = context;

}

@JavascriptInterface  //加上这一句话,不然的话在高版本的时候有可能报错

public void tokenFailed() { //如果token失效其他两个fragment会提示 此处不做处理

LogUtild("tokenFailed: ");

}

@JavascriptInterface  //加上这一句话,不然的话在高版本的时候有可能报错

public void busNone() { //车辆不存在

ToastUtilsshowShortToast( "车辆不存在");

}

//as调用js

public void getAvg(final String response) {

getActivity()runOnUiThread(new Runnable() {

@Override

public void run() {

busDataWebViewloadUrl("javascript:getAvg('" + response + "')");

}

});

}

public void getWarnByDay(final String response, final String type) {

getActivity()runOnUiThread(new Runnable() {

@Override

public void run() {

busDataWebViewloadUrl("javascript:getWarnByDay('" + response + "','" + type + "')");

}

});

}

}

在下面是初始化通信

//打开本包内assets目录下的indexhtml文件

busDataWebViewloadUrl("file:///android_asset/pages/datahtml");

//1、设置允许执行的JS脚本

busDataWebViewgetSettings()setJavaScriptEnabled(true);

mInterface = new WebAPPInterface(getContext());

//2、添加通信接口

busDataWebViewaddJavascriptInterface(mInterface, "app");

一、对于Android和ios我们要执行不同的 *** 作,下面是判断系统的js代码

// alert(ismobile(1)); 1表示Android,0表示ios

function ismobile(test){

var u = navigatoruserAgent, app = navigatorappVersion;

if(/AppleWebKitMobile/itest(navigatoruserAgent) || (/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/test(navigatoruserAgent))){

if(windowlocationhrefindexOf("mobile")&lt;0){

try{

if(/iPhone|mac|iPod|iPad/itest(navigatoruserAgent)){

return '0';

}else{

return '1';

}

}catch(e){}

}

}else if( uindexOf('iPad') &gt; -1){

return '0';

}else{

return '1';

}

}

二、js调用app端函数,下面是js代码

if(ismobile(1)==1){

AndroidsetTypeActivity(id,type,href);

}else{

jsToios(id,type,href);

}

setTypeActivity是Android端定义的函数,jsToios是ios端定义的函数,括号里是js端传递的参数。

三、至于js端怎样获取app端的数据,只需在js端提供给app端函数名字,在通知app端调用即可

四、还有一种方法可以不通过app的方法将数据传递给另一个页面,那就是通过URL的方式

在本页面将数据拼接在ip后面

在另外一个页面通过下面方法获取URL后的参数

function GetRequest() {

var url = locationsearch; //获取url中""符后的字串

var theRequest = new Object();

if (urlindexOf("") != -1) {

var str = urlsubstr(1);

strs = strsplit("&");

for(var i = 0; i < strslength; i ++) {

theRequest[strs[i]split("=")[0]]=decodeURIComponent(strs[i]split("=")[1]);

}

}

return theRequest;

}

// 获取URL参数

var Request = new Object();

Request = GetRequest();

var name;

name = Request['name'];

以上就是关于Android Studio的Java程序如何打开网页并获取返回值全部的内容,包括:Android Studio的Java程序如何打开网页并获取返回值、怎么在原生页面上给js回调 android、在Android上怎样实现JAVA和JS交互等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9528987.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存