千锋3G嵌入式移动互联网技术研发中心,第2部分——交付混合了JSON的ANDROID应用程序(二)连接JavaScript接口清单5.CalculatorHandler实现清单6.WebView控件中呈现(和执行)的index.html插入JavaScript代码清单7.从Java调用PerformSimpleCalculation()JavaScript函数清单8.通过传递一个JSON对象调用更复杂的函数交换JSON对象结束语接口下一步是启用Activity中的Java代码,以与WebView管理的HTML文件中的JavaScript代码交互。这是通过调用addJavascriptInterface()方法完成的,如清单4所示。该函数的参数是一个Java类的实例和一个名称空间标识符。例如,对于这个应用程序,您定义一个calc名称空间,并实现名为CalculatorHandler的类中的代码,如清单5所示。实现//JavascripthandlerfinalclassCalculatorHandler{privateintiterations=0;//writetoLogCat(Info)publicvoidInfo(Stringstr){iterations++;Log.i(Calc,str);}//writetoLogCat(Error)publicvoidError(Stringstr){iterations++;Log.e(Calc,str);}//sampletoretrieveacustom-writtenfunctionwiththedetailsprovided//bytheAndroidnativeapplicationcodepublicStringGetSomeFunction(){iterations++;returnvarq=6;functiondynamicFunc(v){returnv+q;};}//KilltheapppublicvoidEndApp(){iterations++;finish();}嵌入式移动互联网技术研发中心publicvoidsetAnswer(Stringa){iterations++;Log.i(tag,Answer[+a+]);}publicintgetIterations(){returniterations;}publicvoidSendHistory(Strings){Log.i(Calc,SendHistory+s);try{JSONArrayja=newJSONArray(s);for(inti=0;ija.length();i++){Log.i(Calc,Historyentry#+(i+1)+is[+ja.getString(i)+]);}}catch(Exceptionee){Log.e(Calc,ee.getMessage());}}}嵌入式移动互联网技术研发中心在JavaScript环境中,通过window.calc.methodname语法访问CalculatorHandler的方法。例如,CalculatorHandler实现一个名为Info()的方法,后者接受一个字符串参数并将之写到应用程序日志中。要从JavaScript环境访问此方法,可使用类似这样的语法:window.calc.Info(writethisstringtotheapplicationlog!);。基本了解了如何从JavaScript代码调用Java代码之后,我们再来看清单6中的index.html文件,看各种方法是如何被调用的。控件中呈现(和执行)的INDEX.HTMLhtmlheadmetaname=viewportcontent=width=device-width,initial-scale=0.25,user-scalable=yes/titleAndroidtoJavaScriptwithJSON/title/headscriptlanguage=JavaScriptvarcmdHistory=newArray();嵌入式移动互联网技术研发中心functionstartup(){try{window.calc.Info(Startingup....);cmdHistory[cmdHistory.length]=startup;}catch(ee){}}嵌入式移动互联网技术研发中心functionPerformSimpleCalculation(formula){try{cmdHistory[cmdHistory.length]=PerformSimpleCalculation;varanswer=eval(String(formula));document.getElementById('data').value=answer;window.calc.setAnswer(answer);}catch(ee){window.calc.Error(ee);}}嵌入式移动互联网技术研发中心functionPerformComplexCalculation(andmethod){try{/**argumenttothisfunctionisasingleobjectwith2membersorproperties*operation:thisisastringnamingwhatwewantthefunctiontodo.*arrayofarguments:thisisanarrayofintegers**///alert(andmethod.operation);//alert(andmethod.arguments.length);嵌入式移动互联网技术研发中心if(andmethod.operation==addarray){cmdHistory[cmdHistory.length]=PerformCompleCalculation-addarray;vari;varresult=0;for(i=0;iandmethod.arguments.length;i++){result+=andmethod.arguments[i];}document.getElementById('data').value=result;window.calc.setAnswer(result);}嵌入式移动互联网技术研发中心if(andmethod.operation==multarray){cmdHistory[cmdHistory.length]=PerformCompleCalculation-multarray;vari;varresult=1;for(i=0;iandmethod.arguments.length;i++){result*=andmethod.arguments[i];}document.getElementById('data').value=result;window.calc.setAnswer(result);}}catch(ee){window.calc.Error(ee);}}嵌入式移动互联网技术研发中心functiondynamicfunction(){try{cmdHistory[cmdHistory.length]=PerformCompleCalculation-dynamic;eval(String(window.calc.GetSomeFunction()));varresult=dynamicFunc(parseInt(document.getElementById('data').value));document.getElementById('data').value=result;}catch(ee){alert(ee);}}/script嵌入式移动互联网技术研发中心bodycenterh3RunninginWebView:)/h3thisissomesampletextherebr/inputtype=textid=datavalue=startingvaluebr/buttononclick=window.calc.Info(document.getElementById('data').value);LogInfo/button buttononclick=window.calc.Error(document.getElementById('data').value);LogError/buttonbr/buttononclick=dynamicfunction();Dynamic/buttonbuttononclick=alert(String(window.calc.getIterations()));HowManyCalls/buttonbuttononclick=window.calc.SendHistory(JSON.stringify(cmdHistory));History/buttonbuttononclick=if(window.confirm('EndApp?'))window.calc.EndApp();KillThisApp/buttonbr//center/body/html嵌入式移动互联网技术研发中心仔细研究一下清单6末尾的按钮处理程序。基本上,这些按钮处理程序都调用window.calc名称空间中的方法,这些方法在AndroidJSON.java中的CalculatorHandler类中实现。清单5和清单6协同工作,演示了JavaScript环境中初始化的和Java源文件中实现的代码交互。但是如何从Activity代码中初始化一些您想要在WebView中发生的动作呢?现在应该更深入地来看Java代码了。