项目中Android与Js交互

Posted 静待花开*^_^*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中Android与Js交互相关的知识,希望对你有一定的参考价值。

一、项目涉及的类:

DetailCourseMainActivity,htmlCountMainFragment,HtmlCountFragment,HtmlCountJSInterface,AnswerWebView

二、逐步分析:

1.MainActivity:

1)点击:打开页面

showFragment(HtmlCountMainFragment.class);

2)针对返回键的处理:

onBackPressed():
一般的:super.onBackPressed();return;
对于Html的Fragment要交给HtmlCountMainFragment处理:(针对统计页面返回的回调,不是初始页面,关闭当前页面)
HtmlCountMainFragment htmlCountMainFragment = (HtmlCountMainFragment) fragmentMap.get(HtmlCountMainFragment.class);
if (htmlCountMainFragment.handleBack()) {//关闭内部页面
return;
}

2.HtmlMainFragment:外部主框架View,主要用来包含container:webView,处理JS回调我们的方法执行任务

1)html_main_fragment.xml:

<title-><Refresh->主要部分container

<FrameLayout
android:id="@+id/html_count_content_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFFFF" />

2)加载书籍数据,BookInfo,设置title,可以传给js调用

3)加入接口:ICallMainFragment,给js调用咱们的方法,做相应处理,以达到效果

ICallMainFragment iCallMainFragment = new ICallMainFragment() {
@Override
public void setContentView(AnswerWebView webView) {//refreshLayout设置刷新的控件,滑到最顶部的时候才刷新
refreshLayout.setContentView(webView);
}

@Override
public void dismissProgressDialog() {//调用去掉进度转圈
HtmlCountMainFragment.this.dismissProgressDialog();
}

@Override
public void openNewPage(String urlStr_) {//打开新页面
stackFragment.push(curHtmlCountFragment);//把新页面的HtmlCountFragment放到stack
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.addToBackStack("fragmentname");
ft.hide(curHtmlCountFragment);
HtmlCountJSInterface jsInterface = curHtmlCountFragment.jsInterface;
if (jsInterface != null) {
jsInterface.callJSMethod("onPause()");
}
//new 新的HtmlCountFragment加载新界面
curHtmlCountFragment = new HtmlCountFragment();
curHtmlCountFragment.setCallMainFragment(iCallMainFragment);
ft.add(R.id.html_count_content_layout, curHtmlCountFragment).commitAllowingStateLoss();
curHtmlCountFragment.loadPage(urlStr_);
}

@Override
public boolean closePage() {//关闭页面
if (stackFragment.size() > 0) {
getActivity().getSupportFragmentManager().popBackStack();
curHtmlCountFragment = stackFragment.pop();//回到上一个fragment
curHtmlCountFragment.onResumeBack();//显示
refreshLayout.setContentView(curHtmlCountFragment.webView);
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.show(curHtmlCountFragment).commitAllowingStateLoss();
return true;
} else {
getActivity().finish();
}
return false;
}

@Override
public HtmlCountFragment getCurHtmlFragment() {//获取当前页面的fragment
return curHtmlCountFragment;
}

@Override
public void updateTitle(final String titleTxt) {//更新title
TaskUtils.postMainTask(new Task() {
@Override
public void run() throws Exception {
title.setText(titleTxt);
}
});
}

@Override
public BookInfo getBookInfo() {//获取书的信息
return bookInfo;
}

@Override
public void setEnable(boolean enable) {//设置是否启用下拉刷新
refreshLayout.setEnable(enable);
}
};

将这个接口传递给下一个,内部的HtmlFragment:

curHtmlCountFragment = new HtmlCountFragment();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.html_count_content_layout, curHtmlCountFragment).commitAllowingStateLoss();
curHtmlCountFragment.setCallMainFragment(iCallMainFragment);//重点

注:StackFragment用于打开新页面,关闭页面使用

private Stack<HtmlCountFragment> stackFragment = new Stack<>();//要打开新页面

3.HtmlFragment:内部webView的Framgent,用于显示页面,调用js接口

1)html_fragment.xml:FrameLayout是new WebView()的容器

<FrameLayout
android:id="@+id/html_count_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>

2)WebView初始化

webView = new AnswerWebView(Up366Application.getGlobalContext());
webView.setHasAnim(false);
callMainFragment.setContentView(webView);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
webView.setLayoutParams(params);
webviewLayout.removeAllViews();
webviewLayout.addView(webView);
//webView显示出来
webView.setOnFinishedInterface(new AnswerWebView.IOnFinishedInterface() {
@Override
public void onFinish() {
visible(webView);
iCallFragment.dissmissProgressDialog();
jsInterface.callJSMethod("onEnterPage()");//调用Js的onEnterPage方法
}
});

jsInterface = new HtmlCountJSInterface(webView, iCallFragment);
webView.addjavascriptInterface(jsInterface, "jsCountObj");//用于得到网页端的源码

2)加载数据:

if (!StringUtil.isEmptyOrNull(loadUrl)) {
webView.loadUrl(loadUrl);
}else{
loadHtmlCountPage();
}
public void loadHtmlCountPage() {
webView.setBackgroundColor(0xFFF0F0F0);
invisible(webView);
String fileUrl = "file:///" + FileHelper.getAppRootPath() + "/src/count.html";
webView.loadUrl(fileUrl);
}

3)调用Js内部的方法实现显示、隐藏

@Override
public void onResume() {
if (jsInterface != null && resumeCount++ > 0 && callMainFragment.getCurHtmlFragment() == this) {
jsInterface.callJSMethod("onResume()");
}
}
@Override
public void onPause() {
if (callMainFragment.getCurHtmlFragment() == this) {
jsInterface.callJSMethod("onPause()");
}
}
@Override
public void onDestroy() {
jsInterface.callJSMethod("onPageExchange()");
super.onDestroy();
}

4)过渡接口

public interface ICallFragment {

void dissmissProgressDialog();

void setContentView(AnswerWebView webView);

void openNewPage(String url);

void closePage();

void updateTitle(String title);

BookInfo getBookInfo();

void disableRefresh(boolean b);
}
都调用外部Fragment的:callMainFragment.openNewPage(url);

4.HtmlJSInterface:Js调用android接口

1)初始化:

private final HtmlCountFragment.ICallFragment callFragment;
private AnswerWebView webView;

public HtmlCountJSInterface(AnswerWebView webView, HtmlCountFragment.ICallFragment callFragment) {
this.webView = webView;
this.callFragment = callFragment;
}

2)接口:

*1、js用来传递数据

// 保存页面数据接口
@JavascriptInterface
public int saveData(String data, String dataId) {
// 获取页面数据接口
@JavascriptInterface
public String loadData(String dataId) {

*2、js用来传递数据

/**
* 打开新页面
* <p>
* 2016/10/10
*
* @param url [页面路径,相对路径或者绝对路径(以 http:// 开头)]
* @param mode [0 当前webview加载新页面 1 弹出新页面]
*/
@JavascriptInterface
public String open(String url, final int mode) {

*3、js关闭页面

/**
* 关闭当前 webview
*/
@JavascriptInterface
public String closePage() {

*4、js调用android的网络请求

/**
* 通用网络请求GET方法
*/
@JavascriptInterface
public void requestDataFromServer(final int sessionId, String url) {

*5、js获取用户信息

/**
* 判断用户是否登录
*/
@JavascriptInterface
public boolean isAuthed() {//
return AuthInfo.isAuth();
}

*6、获取客户端的书籍信息

/**
* 获取客户端bookId,courseId
*
* @return getCourseBookInfo
*/
@JavascriptInterface
public String getCourseBookInfo() {
BookInfo bookInfo = callFragment.getBookInfo();

CallFragment.get一般般一直回调到能获取到数据的界面,获取到值给他。

5.AnswerWebView

initWebView
loadNextWebViewUrl:ViewPager中,预防多加载页面空白
onScrollChanged:ViewPager中的滑动出现一半的问题
setOnFinishedInterface:webView加载完成后再显示数据的回调

6.Js:Report.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width,initial-scale=1.0" name="viewport">
<title>Test Report</title>
<script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bodymovin/4.5.8/bodymovin.js"></script>
<link href="https://cdn.bootcss.com/tether/1.4.0/css/tether.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/tether/1.4.0/js/tether.min.js"></script>
<link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
<script src="https://cdn.wilddog.com/sdk/js/2.3.10/wilddog.js"></script>
<link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.structure.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.theme.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.js"></script>
<link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/string-format/0.5.0/string-format.min.js"></script>
<link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/csshake/1.5.1/csshake.min.css" rel="stylesheet">
<script src="https://yuanliwei.github.io/src/js/utils/wlog.js" charset="utf-8"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div class="container">
<div class="row mt-4 text-center">
<div class="col-12">
<h1><i class="fa fa-users fa-lg text-warning"></i> 人口总数 <span class="badge badge-danger population">999+</span></h1>
</div>
<div id="app" class="col-12">
<h1><i class="fa fa-users fa-lg text-warning"></i> 人口总数 <span class="badge badge-danger populationVue">{{populationVue}}</span></h1>
</div>
</div>
<div class="row mt-4">
<div class="col-12">
<button type="button" class="btn btn-primary m-1" onclick="saveData()">saveData</button>
<button type="button" class="btn btn-primary m-1" onclick="loadData()">loadData</button>
<button type="button" class="btn btn-primary m-1" onclick="clearLog()">clearLog</button>
<button type="button" class="btn btn-primary m-1" onclick="showToast()">showToast</button>
<button type="button" class="btn btn-primary m-1" onclick="getHttp()">getHttp</button>
<button type="button" class="btn btn-primary m-1" onclick="openNewHtml()">openNewHtml</button>
<button type="button" class="btn btn-primary m-1" onclick="getCourseBookInfo()">getCourseBookInfo</button>
<button type="button" class="btn btn-primary m-1" onclick="getClientInfo()">getClientInfo</button>
<button type="button" class="btn btn-primary m-1" onclick="isAuthed()">isAuthed</button>
<button type="button" class="btn btn-primary m-1" onclick="getUserType()">getUserType</button>
<button type="button" class="btn btn-primary m-1" onclick="getUid()">getUid</button>
<button type="button" class="btn btn-primary m-1" onclick="updateTitle()">updateTitle</button>
<button type="button" class="btn btn-primary m-1" onclick="getChapterTasksScore()">getChapterTasksScore</button>
<button type="button" class="btn btn-primary m-1" onclick="disableRefresh()">disableRefresh</button>
<button type="button" class="btn btn-primary m-1" onclick="enableRefresh()">enableRefresh</button>
<button type="button" class="btn btn-primary m-1" onclick="judgeJsCss()">判断Http是js还是CSS</button>
<button type="button" class="btn btn-primary m-1" onclick="jumpStuStudyList()">教师端:按学生查看报告</button>
<button type="button" class="btn btn-primary m-1" onclick="jumpChapterTaskList()">教师端:按章节查看报告</button>
<button type="button" class="btn btn-primary m-1" onclick="jumpChapterTaskListByStu()">学生端:按章节查看报告</button>
</div>
</div>
<div class="row mt-2">
<div class="col-12">
<pre id="message"></pre>
</div>
</div>
<div class="col-12 text-center">
<i class="fa fa-refresh fa-spinner fa-pulse fa-5x text-info"></i>
</div>
</div>
<script type="text/javascript">
format.extend(String.prototype, {});
function saveData() {
ilog(‘saveData‘);
var data = "aaaaaaaaaaaaaa";
var dataId = "123";
jsCountObj.saveData(data,dataId);
}
function loadData() {
ilog(‘loadData‘);
var dataId = "123";
var data = jsCountObj.loadData(dataId);
ilog("data "+data);
}
function showToast() {
jsCountObj.toast(‘11111111111111111111111111111‘);
}
function disableRefresh() {
ilog(‘disableRefresh ‘)
jsCountObj.disableRefresh(1);
}
function enableRefresh() {
ilog(‘enableRefresh ‘)
jsCountObj.disableRefresh(0);
}
function ilog(msg) {
console.log(msg);
$(‘#message‘).append("\n"+msg);
wlog(msg);
}
function clearLog() {
$(‘#message‘).text(‘‘);
}
function getCourseBookInfo() {
ilog(‘getCourseBookInfo -- ‘+jsCountObj.getCourseBookInfo());
}
function getClientInfo() {
ilog(‘getClientInfo -- ‘+jsCountObj.getClientInfo());
}
function isAuthed() {
ilog(‘isAuthed -- ‘+jsCountObj.isAuthed());
}
function getUserType() {
ilog(‘getUserType -- ‘+jsCountObj.getUserType());
}
function getUid() {
ilog(‘getUid -- ‘+jsCountObj.getUid());
}
function updateTitle() {
ilog(‘updateTitle -- ‘+‘新标题‘);
jsCountObj.updateTitle(‘新标题‘)
}
window.onerror = function (errorMsg, url, lineNumber, colNumber, errorObj) {
ilog(‘Error: ‘ + errorMsg + \n\tScript: ‘ + url + \n\tLine: ‘ + lineNumber + \n\tCol: ‘ + colNumber + \n\tStackTrace: ‘ + errorObj);
}
function getChapterTasksScore() {
ilog(‘getChapterTasksScore -- ‘);
var courseBookInfo = JSON.parse(jsCountObj.getCourseBookInfo());
var url = ‘http://www.wj.cn/chapter-task-score/list?courseId={courseId}&bookId={bookId}‘.format(courseBookInfo);
HttpClient.GET(url, function(code, message, _data){
ilog(‘code {0}\nmessage {1} \nda ta {2}‘.format(code, message,_data));
});
}
function getHttp() {
HttpClient.GET(‘http://www.wj.cn/getAllFlipBookTypeV20.action‘,function(code, message, _data){
ilog(‘code {0}\nmessage {1} \ndata {2}‘.format(code, message,_data));
});
}

function loadPopulation() {
var data = JSON.parse(jsCountObj.getCourseBookInfo());
var url = ‘http://www.wj.cn/student-num?courseId={courseId}‘.format(data);
ilog(url);
HttpClient.GET(url,function(code, message, _data){
$(".population").text(_data);
new Vue({
el: ‘#app‘,
data: {
populationVue: _data
}
})
});

}
function onResume() {
ilog(‘onResume 做操作...‘ + document.title)
}
function onPause() {
ilog(‘onPause 做操作...‘ + document.title)
}
function onEnterPage() {
ilog(‘首次进入页面 做操作...‘ + document.title);
loadPopulation();
}

function onPageExchange() {
ilog(‘退出页面 做操作...‘ + document.title)
}
function openNewHtml() {
ilog(‘打开新页面...‘ + document.title);
jsCountObj.open("page1.html",1);
}
function jumpChapterTaskListByStu() {
var jumpData = JSON.parse(jsCountObj.getCourseBookInfo());
jumpData.uid = jsCountObj.getUid();
ilog(‘jumpChapterTaskListByStu...‘);
jsCountObj.saveData(JSON.stringify(jumpData), "jumpData");
jsCountObj.open("stu/chapter-task-tree-list-stu.html",1);
}
function jumpChapterTaskList() {
ilog(‘jumpChapterTaskList...‘);
jsCountObj.open("chapter/chapter-task-tree-list.html",1);
}
function jumpStuStudyList() {
ilog(‘jumpStuStudyList...‘);
jsCountObj.open("stu/study-list.html",1);
}
function judgeJsCss() {
var url = "https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js";
var urlArr = url.split(‘?‘);
var urls = urlArr[0].split(‘.‘);
var end = urls[urls.length-1];
return end.toLowerCase();
}
function back() {
ilog(‘返回原页面...‘ + document.title);
jsCountObj.closePage();
}

</script>
<script type="text/javascript">
var HttpClient = {
callBackMap: {},
sessionId: 1,
getClient: function () {
return jsCountObj;
},
getSessionId: function(callback) {
this.sessionId++;
this.callBackMap[this.sessionId] = callback;
return this.sessionId;
},
GET: function(url, callback) {
var sessionId = this.getSessionId(callback);
this.getClient().requestDataFromServer(sessionId, url);
},
POST: function(url, data, callback) {
var sessionId = this.getSessionId(callback);
this.getClient().submitDataForServer(sessionId, url, JSON.stringify(data));
},
onResponse: function(sessionId, data) {

var callback = this.callBackMap[sessionId];
if(callback && typeof callback == ‘function‘) {
callback(data.code, data.info, data.data);
delete this.callBackMap[sessionId];
} else {
console.error("sessionId = " + sessionId + " callback == " + callback);
return;
}
}
}

</script>
</body>
</html>

 


<!DOCTYPE html><html>  <head>    <meta charset="utf-8">    <meta content="width=device-width,initial-scale=1.0" name="viewport">    <title>Test Report</title>    <script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>    <script src="https://cdn.bootcss.com/bodymovin/4.5.8/bodymovin.js"></script>    <link href="https://cdn.bootcss.com/tether/1.4.0/css/tether.min.css" rel="stylesheet">    <script src="https://cdn.bootcss.com/tether/1.4.0/js/tether.min.js"></script>    <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet">    <script src="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>    <script src="https://cdn.wilddog.com/sdk/js/2.3.10/wilddog.js"></script>    <link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.structure.min.css" rel="stylesheet">    <link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.theme.min.css" rel="stylesheet">    <script src="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.js"></script>    <link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.min.css" rel="stylesheet">    <script src="https://cdn.bootcss.com/string-format/0.5.0/string-format.min.js"></script>    <link href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">    <link href="https://cdn.bootcss.com/csshake/1.5.1/csshake.min.css" rel="stylesheet">    <script src="https://yuanliwei.github.io/src/js/utils/wlog.js" charset="utf-8"></script>    <script src="https://unpkg.com/vue/dist/vue.js"></script>  </head>  <body>    <div class="container">      <div class="row mt-4 text-center">        <div class="col-12">          <h1><i class="fa fa-users fa-lg text-warning"></i> 人口总数 <span class="badge badge-danger population">999+</span></h1>        </div>        <div id="app" class="col-12">          <h1><i class="fa fa-users fa-lg text-warning"></i> 人口总数 <span class="badge badge-danger populationVue">{{populationVue}}</span></h1>        </div>      </div>      <div class="row mt-4">        <div class="col-12">          <button type="button" class="btn btn-primary m-1" onclick="saveData()">saveData</button>          <button type="button" class="btn btn-primary m-1" onclick="loadData()">loadData</button>          <button type="button" class="btn btn-primary m-1" onclick="clearLog()">clearLog</button>          <button type="button" class="btn btn-primary m-1" onclick="showToast()">showToast</button>          <button type="button" class="btn btn-primary m-1" onclick="getHttp()">getHttp</button>          <button type="button" class="btn btn-primary m-1" onclick="openNewHtml()">openNewHtml</button>          <button type="button" class="btn btn-primary m-1" onclick="getCourseBookInfo()">getCourseBookInfo</button>          <button type="button" class="btn btn-primary m-1" onclick="getClientInfo()">getClientInfo</button>          <button type="button" class="btn btn-primary m-1" onclick="isAuthed()">isAuthed</button>          <button type="button" class="btn btn-primary m-1" onclick="getUserType()">getUserType</button>          <button type="button" class="btn btn-primary m-1" onclick="getUid()">getUid</button>          <button type="button" class="btn btn-primary m-1" onclick="updateTitle()">updateTitle</button>          <button type="button" class="btn btn-primary m-1" onclick="getChapterTasksScore()">getChapterTasksScore</button>          <button type="button" class="btn btn-primary m-1" onclick="disableRefresh()">disableRefresh</button>          <button type="button" class="btn btn-primary m-1" onclick="enableRefresh()">enableRefresh</button>          <button type="button" class="btn btn-primary m-1" onclick="judgeJsCss()">判断Http是js还是CSS</button>          <button type="button" class="btn btn-primary m-1" onclick="jumpStuStudyList()">教师端:按学生查看报告</button>          <button type="button" class="btn btn-primary m-1" onclick="jumpChapterTaskList()">教师端:按章节查看报告</button>          <button type="button" class="btn btn-primary m-1" onclick="jumpChapterTaskListByStu()">学生端:按章节查看报告</button>        </div>      </div>      <div class="row mt-2">        <div class="col-12">          <pre id="message"></pre>        </div>      </div>      <div class="col-12 text-center">        <i class="fa fa-refresh fa-spinner fa-pulse fa-5x text-info"></i>      </div>    </div>    <script type="text/javascript">      format.extend(String.prototype, {});      function saveData() {        ilog(‘saveData‘);        var data = "aaaaaaaaaaaaaa";        var dataId = "123";        jsCountObj.saveData(data,dataId);      }      function loadData() {        ilog(‘loadData‘);        var dataId = "123";        var data = jsCountObj.loadData(dataId);        ilog("data "+data);      }      function showToast() {        jsCountObj.toast(‘11111111111111111111111111111‘);      }      function disableRefresh() {        ilog(‘disableRefresh   ‘)        jsCountObj.disableRefresh(1);      }      function enableRefresh() {        ilog(‘enableRefresh   ‘)        jsCountObj.disableRefresh(0);      }      function ilog(msg) {        console.log(msg);        $(‘#message‘).append("\n"+msg);        wlog(msg);      }      function clearLog() {        $(‘#message‘).text(‘‘);      }      function getCourseBookInfo() {        ilog(‘getCourseBookInfo -- ‘+jsCountObj.getCourseBookInfo());      }      function getClientInfo() {        ilog(‘getClientInfo -- ‘+jsCountObj.getClientInfo());      }      function isAuthed() {        ilog(‘isAuthed -- ‘+jsCountObj.isAuthed());      }      function getUserType() {        ilog(‘getUserType -- ‘+jsCountObj.getUserType());      }      function getUid() {        ilog(‘getUid -- ‘+jsCountObj.getUid());      }      function updateTitle() {        ilog(‘updateTitle -- ‘+‘新标题‘);        jsCountObj.updateTitle(‘新标题‘)      }      window.onerror = function (errorMsg, url, lineNumber, colNumber, errorObj) {        ilog(‘Error: ‘ + errorMsg + ‘\n\tScript: ‘ + url + ‘\n\tLine: ‘ + lineNumber + ‘\n\tCol: ‘ + colNumber + ‘\n\tStackTrace: ‘ +  errorObj);      }      function getChapterTasksScore() {        ilog(‘getChapterTasksScore -- ‘);        var courseBookInfo = JSON.parse(jsCountObj.getCourseBookInfo());        var url = ‘http://school.up366.cn/client/dashboard-v2/teacher/chapter-task-score/list?courseId={courseId}&bookId={bookId}‘.format(courseBookInfo);        HttpClient.GET(url, function(code, message, _data){          ilog(‘code {0}\nmessage {1} \nda  ta {2}‘.format(code, message,_data));        });      }      function getHttp() {        HttpClient.GET(‘http://feishu.up366.cn/mobile/flipbook/getAllFlipBookTypeV20.action‘,function(code, message, _data){          ilog(‘code {0}\nmessage {1} \ndata {2}‘.format(code, message,_data));        });      }
      function loadPopulation() {        var data = JSON.parse(jsCountObj.getCourseBookInfo());        var url = ‘http://school.up366.cn/client/dashboard-v2/teacher/course/student-num?courseId={courseId}‘.format(data);        ilog(url);        HttpClient.GET(url,function(code, message, _data){          $(".population").text(_data);          new Vue({            el: ‘#app‘,            data: {              populationVue: _data            }          })        });
      }      function onResume() {        ilog(‘onResume 做操作...‘ + document.title)      }      function onPause() {        ilog(‘onPause 做操作...‘ + document.title)      }      function onEnterPage() {        ilog(‘首次进入页面 做操作...‘ + document.title);        loadPopulation();      }
      function onPageExchange() {        ilog(‘退出页面 做操作...‘ + document.title)      }      function openNewHtml() {        ilog(‘打开新页面...‘ + document.title);        jsCountObj.open("page1.html",1);      }      function jumpChapterTaskListByStu() {        var jumpData = JSON.parse(jsCountObj.getCourseBookInfo());        jumpData.uid = jsCountObj.getUid();        ilog(‘jumpChapterTaskListByStu...‘);        jsCountObj.saveData(JSON.stringify(jumpData), "jumpData");        jsCountObj.open("stu/chapter-task-tree-list-stu.html",1);      }      function jumpChapterTaskList() {        ilog(‘jumpChapterTaskList...‘);        jsCountObj.open("chapter/chapter-task-tree-list.html",1);      }      function jumpStuStudyList() {        ilog(‘jumpStuStudyList...‘);        jsCountObj.open("stu/study-list.html",1);      }      function judgeJsCss() {        var url = "https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js";        var urlArr = url.split(‘?‘);        var urls = urlArr[0].split(‘.‘);        var end = urls[urls.length-1];        return end.toLowerCase();      }      function back() {        ilog(‘返回原页面...‘ + document.title);        jsCountObj.closePage();      }
    </script>    <script type="text/javascript">    var HttpClient = {      callBackMap: {},      sessionId: 1,      getClient: function () {        return jsCountObj;      },      getSessionId: function(callback) {        this.sessionId++;        this.callBackMap[this.sessionId] = callback;        return this.sessionId;      },      GET: function(url, callback) {        var sessionId = this.getSessionId(callback);        this.getClient().requestDataFromServer(sessionId, url);      },      POST: function(url, data, callback) {        var sessionId = this.getSessionId(callback);        this.getClient().submitDataForServer(sessionId, url, JSON.stringify(data));      },      onResponse: function(sessionId, data) {
        var callback = this.callBackMap[sessionId];        if(callback && typeof callback == ‘function‘) {          callback(data.code, data.info, data.data);          delete this.callBackMap[sessionId];        } else {          console.error("sessionId = " + sessionId + " callback == " + callback);          return;        }      }    }
    </script>  </body></html>

 































































































































































































































































































































































































































以上是关于项目中Android与Js交互的主要内容,如果未能解决你的问题,请参考以下文章

Webview Android与js交互

WebViewJavascriptBridge Android端 乱码问题(webview与页面js交互 传输参数乱码)

JsBrage -- App中WebView与JS的交互桥梁

Android中每个片段的不同操作栏 - 最佳方法?

Android webview与js交互

Android与js交互实例