package com.activitys;
|
|
import androidx.annotation.NonNull;
|
|
import android.annotation.SuppressLint;
|
import android.app.Activity;
|
import android.os.Bundle;
|
import android.os.Handler;
|
import android.os.Message;
|
import android.util.Log;
|
import android.view.ViewGroup;
|
import android.webkit.JavascriptInterface;
|
import android.webkit.JsResult;
|
import android.webkit.WebChromeClient;
|
import android.webkit.WebSettings;
|
import android.webkit.WebView;
|
import android.webkit.WebViewClient;
|
import android.widget.Toast;
|
|
import com.comm.ServiceModel;
|
import com.example.webapp.R;
|
import com.fbo2206.FBO_ParamDischarge;
|
import com.fbo2206.MySocketClientThread;
|
import com.fbs9100.FBS_ComBase;
|
import com.google.gson.Gson;
|
|
import io.dcloud.c.h;
|
|
public class Index_activity extends Activity {
|
private final static String TAG = "Index_activity";
|
private ServiceModel model;
|
private WebView webView;
|
private Handler handler;
|
|
private MyJavaScriptInterface myJavaScriptInterface;
|
|
private MySocketClientThread socketClientThread = null;
|
|
|
@SuppressLint("JavascriptInterface")
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
setContentView(R.layout.index_layout);
|
|
//方式1:直接在在Activity中生成
|
webView = (WebView)findViewById(R.id.my_webview);
|
//handler = new Handler();
|
|
//设置支持JavaScript语言,让WebView支持javascript的动作
|
webView.getSettings().setJavaScriptEnabled(true);
|
|
WebSettings webSettings = webView.getSettings();
|
webSettings.setSupportZoom(true);
|
webSettings.setBuiltInZoomControls(true);
|
webSettings.setUseWideViewPort(true);
|
webSettings.setLoadWithOverviewMode(true);
|
webSettings.setDefaultTextEncodingName("utf-8");
|
|
//交互对象的添加,传入对象在html5界面的javascript中获取,该对象用于两者之间的交互。question,给JavaScript添加一个与之交互的接口,传入一个对象和该对象的名字,在html5端根据这个名字得到对象
|
//提供一个供h5交互的对象,并给对象标记个名字供js识别
|
//webView.addJavascriptInterface( model = new ServiceModel(), "model");
|
//webView.addJavascriptInterface( mUser = new User(), "user");
|
webView.addJavascriptInterface( myJavaScriptInterface = new MyJavaScriptInterface(), "JavaScriptInterface");
|
//自定义实现alert
|
webView.setWebChromeClient(new MyWebChromClient());
|
//要加载的页面
|
webView.loadUrl("file:///android_asset/apps/HelloH5/www/index.html");
|
|
webView.setWebViewClient(new WebViewClient(){
|
@Override
|
public boolean shouldOverrideUrlLoading(WebView view,String url) {
|
view.loadUrl(url);
|
return true;
|
}
|
|
@Override
|
public void onPageFinished(WebView view, String url) {
|
super.onPageFinished(view, url);
|
}
|
});
|
|
handler = new Handler(){
|
@Override
|
public void handleMessage(@NonNull Message msg) {
|
if(webView != null){
|
ServiceModel model = (ServiceModel)msg.obj;
|
Log.e(TAG, "handleMessage: "+model+"%%%%%%%%%%%%" );
|
myJavaScriptInterface.sendMessageToJavaScript(model);
|
}
|
}
|
};
|
|
socketClientThread = new MySocketClientThread();
|
socketClientThread.start();
|
}
|
|
@Override
|
protected void onDestroy() {
|
if (webView != null) {
|
webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
|
webView.clearHistory();
|
|
((ViewGroup) webView.getParent()).removeView(webView);
|
webView.destroy();
|
webView = null;
|
}
|
super.onDestroy();
|
}
|
|
|
class MyWebViewClient extends WebViewClient {
|
//不重新打开系统的浏览器加载网页
|
@Override
|
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
view.loadUrl(url);
|
return true;
|
}
|
|
}
|
private class MyWebChromClient extends WebChromeClient{
|
//捕获html5 js中的alert事件, 将alert事件转换为Toast形式显示,但是不道为啥我的能toast,但是toast之后输入框的焦点就没有了,不能再输入第二次了,我用的是魅族手机
|
@Override
|
public boolean onJsAlert(WebView view, String url, String message,
|
JsResult result) {
|
Toast.makeText(Index_activity.this, message, Toast.LENGTH_SHORT).show();
|
Log.i("TAG", message);
|
return true;
|
}
|
|
}
|
|
class MyJavaScriptInterface{
|
private Gson gson ;
|
|
//将接收到的数据发送给前台JS
|
public void sendMessageToJavaScript(ServiceModel model){
|
gson = new Gson();
|
String json = gson.toJson(model);
|
webView.loadUrl("javascript:showInfoFromJava('" + json + "')");
|
}
|
|
@JavascriptInterface
|
//接收前台JS发送的数据
|
public void receiveMessageFromJavaScript(String json){
|
Log.e(TAG, "receiveMessageFromJavaScript: $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"+json);
|
gson = new Gson();
|
model = gson.fromJson(json,ServiceModel.class);
|
Log.e(TAG, "receiveMessageFromJavaScript: "+model);
|
Log.e(TAG, "receiveMessageFromJavaScript: "+"##############################################################" );
|
Object obj = null;
|
if(FBS_ComBase.CMD_SETDEVICEIP == model.cmd){
|
//设置设备的ip地址
|
MySocketClientThread.server_ip = model.msg;
|
model.cmd = FBS_ComBase.CMD_STARTCNNECT; //开始通信
|
|
}else if(FBS_ComBase.CMD_SetDischargeParm == model.cmd){
|
FBO_ParamDischarge param = gson.fromJson(model.data.toString(),FBO_ParamDischarge.class);
|
obj = param;
|
}
|
|
sendMessageToSocketClient(handler,model.cmd,obj);
|
}
|
}
|
|
private boolean sendMessageToSocketClient(Handler handler, int cmd, Object FBS_data)
|
{
|
ServiceModel model = new ServiceModel();
|
model.handler = handler;
|
model.msg = "Request FBSdata from BattChargeParamACT";
|
model.cmd = cmd;
|
model.data = FBS_data;
|
|
Message childMsg = socketClientThread.mHandler.obtainMessage();
|
childMsg.obj = model;
|
return (socketClientThread.mHandler.sendMessage(childMsg));
|
}
|
}
|