In the last lecture, the main process and framework have been introduced,
Looking at the whole code again, I found that there were some details that I didn't enumerate,
For example, before just introduced addjavascript one way to achieve communication, in fact, there is another way of communication is the prompt way, the introduction of this story again.
Prompt has several advantages:
1. Can avoid the Android 4.2 below, JS security issues
2. Can realize synchronous call, return value directly
The following begins parsing the code logic:
Repeat position, no longer tired. Come straight to cordova.js.
Define ("Cordova/android/nativeapiprovider", function (require, exports, module) {
var nativeapi = this._ cordovanative | | Require (' Cordova/android/promptbasednativeapi '); here in fact, if there is no definition _cordovanative will go prompt
var currentapi = Nativeapi;
Module.exports = {
get:function () {return currentapi;},
setpreferprompt:function (value) {
CURRENTAPI = VA Lue? Require (' Cordova/android/promptbasednativeapi '): Nativeapi;
},
//Used only by tests.
Set:function (value) {
Currentapi = value;
}
};
And in the use of prompt way, the method is the same.
Define ("Cordova/android/promptbasednativeapi", function (require, exports, module) {
module.exports = {
exec: function (Bridgesecret, service, action, Callbackid, Argsjson) {return
prompt Argsjson, ' Gap: ' +json.stringify ([ Bridgesecret, service, Action, Callbackid]);/directly into the Java side, code fragment 1
},
setnativetojsbridgemode:function ( Bridgesecret, value) {
prompt (value, ' Gap_bridge_mode: ' + Bridgesecret);
},
retrievejsmessages:function (Bridgesecret, Fromonlineevent) {return
prompt (+fromonlineevent, ' gap_poll: ' + Bridgesecret);}}
);
Code Snippet 1:systemwebchromeclient.java
@Override Public
Boolean onjsprompt (WebView view, string origin, String message, String defaultvalue, Final jspromptr Esult result) {
//Unlike the @JavascriptInterface bridge, this is always called on the UI thread.
String Handledret = ParentEngine.bridge.promptOnJsPrompt (origin, message, defaultvalue);//code Fragment 2
if (Handledret!= NULL) {
result.confirm (Handledret);
} else {
dialogshelper.showprompt (message, DefaultValue, new Cordovadialogshelper.result () {
@Override public
void Gotresult (Boolean success, String value) {
if ( Success) {
result.confirm (value);
} else {
result.cancel ();}}}
);
return true;
}
Code fragment 2:cordovabridge.java
public string Promptonjsprompt (string origin, String message, string defaultvalue) {if (DefaultValue!= null
&& defaultvalue.length () > 3 && defaultvalue.startswith ("Gap:")) {Jsonarray array;
try {array = new Jsonarray (defaultvalue.substring (4));
int bridgesecret = array.getint (0);
String service = array.getstring (1);
String action = array.getstring (2);
String Callbackid = array.getstring (3); String r = jsexec (Bridgesecret, Service, action, Callbackid, message);//execute return r = NULL in the same process as the logic described earlier ?
"": r;
catch (Jsonexception e) {e.printstacktrace ();
catch (Illegalaccessexception e) {e.printstacktrace ();
Return "";
}//Sets the Native->js bridge mode. else if (defaultvalue!= null && DefaultvaluE.startswith ("Gap_bridge_mode:")) {try {int bridgesecret = Integer.parseint (defaultvalue.sub
String (16));
Jssetnativetojsbridgemode (Bridgesecret, integer.parseint (message));
catch (NumberFormatException e) {e.printstacktrace ();
catch (Illegalaccessexception e) {e.printstacktrace ();
Return ""; }//Polling for JavaScript messages else if (defaultvalue!= null && defaultvalue.startswith ("Gap
_poll: ")" {int bridgesecret = Integer.parseint (defaultvalue.substring (9));
try {String r = jsretrievejsmessages (Bridgesecret, "1". Equals (message)); return r = null?
"": r;
catch (Illegalaccessexception e) {e.printstacktrace ();
Return ""; else if (defaultvalue!= null && defaultvalue.startswith ("Gap_Init: ")) {//Protect against random iframes being able to talk the bridge.
Trust only pages which the app would have been allowed to navigate to anyway. if (Pluginmanager.shouldallowbridgeaccess (Origin)) {//Enable the bridge int bridgemode =
Integer.parseint (defaultvalue.substring (9));
Jsmessagequeue.setbridgemode (Bridgemode);
Tell JS the bridge secret.
int secret = Generatebridgesecret ();
Return "" +secret;
else {LOG.E (Log_tag, "gap_init called from restricted Origin:" + origin);
Return "";
return null; }
Here, the whole process is connected again, no more nonsense.