Bauen Sie eine Brücke! Nahtlose Integration zwischen Android und WebApps
Erstellen Sie mühelos eine robuste Brücke zwischen Ihrem Android und WebApp mit der SimplEnDroidbridge -Bibliothek. Mit dieser Bibliothek können Sie eine Webanwendung in einem Android -Webview rendern und eine jSinterface erstellen, um eine reibungslose Kommunikation zwischen den beiden Plattformen zu ermöglichen. Teilen Sie komplexe Objekte, Versprechen und Rückruffunktionen, während Ihre Webanwendung reaktionsschnell und effizient bleibt.
✓ Teilen Sie Objekte - Android ⇄ Web
✓ Teilen Sie Versprechen - Android ⇄ Web
✓ Rückruffunktionen - Android ← Web
✓ Rufen Sie Funktionen nicht blockiert - Android ⇄ Web
✓ Geben Sie die Sicherheit mit TypeScript - Android + Web ein
Die eingebaute JavaScript-Brücke im Android SDK unterstützt nur primitive Typen. Mit SimplEandroidbridge können Sie komplexe Objekte zwischen Android und Web problemlos freigeben. Definieren Sie einfach die Typen als Argumente oder Rückgabewerte in Ihren nativen Android -Funktionen, und die Bibliothek wandelt automatisch JavaScript -Objekte in Kotlin -Objekte um und umgekehrt.
// Kotlin
class AndroidNativeInterface ( val contactService : ContactService ): DefaultJSInterface( " Android " ) {
@NativeCall( CallType . FULL_SYNC )
fun searchContact ( contactFilter : ContactFilter ): List < Contact > {
return contactService.search(contactFilter)
}
}
data class ContactFilter ( val surname : String? = null , val firstname : String? = null )
data class Contact ( val surname : String? = null , val fistname : String? = null ,
val mail : String? = null , val phonenumber : String? = null ) // Javascript
console . log ( Bridge . interfaces . Android . searchContact ( { surname : "Pitt" } ) )Die JavaScript -Brücke im Android SDK führt Funktionen auf blockierende Weise aus, wodurch die Webanwendung gefriert, bis die native Funktion zurückgibt. Mit dieser Bibliothek können Sie jedoch einen Versprechen-Rückgabe-Typ definieren, der eine nicht blockierende Ausführung ermöglicht. Durch die Verwendung der Funktion "doInbackground" wird der Android -Code in einem Hintergrund -Thread ausgeführt, wodurch die Webanwendung blockiert wird.
// Kotlin
class AndroidNativeInterface ( val contactService : ContactService ): DefaultJSInterface( " Android " ) {
@NativeCall( CallType . FULL_PROMISE )
fun searchContact ( contactFilter : ContactFilter ) = doInBackground< List < Contact >> { promise ->
try {
promise.resolve(contactService.search(contactFilter))
} catch (e : Exception ) {
promise.reject(e)
}
}
}
data class ContactFilter ( val surname : String? = null , val firstname : String? = null )
data class Contact ( val surname : String? = null , val fistname : String? = null ,
val mail : String? = null , val phonenumber : String? = null ) // Javascript
Bridge . interfaces . Android . searchContact ( { surname : "Pitt" } ) . then ( ( list ) => {
console . log ( list ) ;
} ) ;Wenn Sie mit JavaScript vertraut sind, sind Sie wahrscheinlich kein Unbekannter für Rückruffunktionen. SimpleAndroidbridge führt dieses Konzept noch einen Schritt weiter, sodass Sie diese JavaScript -Rückruffunktionen direkt in die Android -Ebene injizieren können, wodurch eine nahtlose Interaktion zwischen Ihrer Webanwendung und Android erstellt wird.
// Kotlin
class AndroidNativeInterface ( val button : Button ): DefaultJSInterface( " Android " ) {
@NativeCall( CallType . FULL_SYNC )
fun registerOnClickAction ( jsFunction : JSFunction ) {
button.setOnClickListener { jsFunction() }
}
} // Javascript
Bridge . interfaces . Android . registerOnClickAction ( ( ) => {
console . log ( "Button Clicked!" )
} ) Um ein Argument an eine JavaScript -Funktion zu übergeben, verwenden Sie den JSFunctionWithArg -Typ, der speziell für die Akzeptanz eines Arguments entwickelt wurde.
// Kotlin
class AndroidNativeInterface ( val button : Button ): DefaultJSInterface( " Android " ) {
var i = 0
@NativeCall( CallType . FULL_SYNC )
fun registerOnClickAction ( jsFunction : JSFunctionWithArg < Int >) {
button.setOnClickListener { jsFunction( ++ i) }
}
} // Javascript
Bridge . interfaces . Android . registerOnClickAction ( ( i ) => {
console . log ( "Button Clicked! " + i )
} )Um mehrere Argumente an eine Funktion zu übergeben, sollten Sie eine Datenklasse erstellen.
Für Funktionen, die ein Ergebnis in die Android -Schicht zurückgeben müssen, können Sie entweder JSFunctionWithPromise für Funktionen ohne Argumente oder JSFunctionWithPromiseAndArg für Funktionen verwenden, die ein Argument akzeptieren.
// Kotlin
class AndroidNativeInterface ( val button : Button ): DefaultJSInterface( " Android " ) {
@NativeCall( CallType . FULL_SYNC )
fun registerOnClickAction ( jsFunction : JSFunctionWithPromiseAndArg < Add , Int >) {
button.setOnClickListener {
val add = Add (( Math .random() * 10 ).toInt(), ( Math .random() * 10 ).toInt())
jsFunction(add)
.then{ Log .d( " AndroidNativeInterface " , " Web calculated: ${add.a} + ${add.b} = $it " ) }
. catch { Log .e( " AndroidNativeInterface " , " ERROR IN WEB LAYER: $it " ) }
}
}
data class Add ( a : Int , b : Int )
} // Javascript
Bridge . interfaces . Android . registerOnClickAction ( ( add ) => {
return new Promise ( ( resolve ) => { resolve ( add . a + add . b ) } )
} )NOTIZ
Um eine JSFunction zu veröffentlichen und ihre Bindung zu löschen, rufen Sie einfach die close auf. JSFunction implementiert die AutoCloseable Schnittstelle, sodass Sie Try-with-Ressourcen oder AutoCloseable.use {} verwenden können.
function.use { it() } Wenn Ihre Webanwendung oder WebView das Nachladen unterstützt, wird außerdem empfohlen, der Brücke einen AfterInitializelistener hinzuzufügen. Dieser Hörer hilft dabei, alle verfügbaren JSFunctions zu veröffentlichen und nach der Initialisierung einen sauberen Zustand zu gewährleisten.
Diese Bibliothek unterstützt verschiedene native Anruftypen, mit denen Sie entscheiden können, wie Sie den nativen Code aufrufen.
Der CallType.FULL_SYNC -Call -Typ ruft den nativen Code auf blockierende Weise auf, wodurch die Ausführung von JavaScript innehalt, bis die native Android -Funktion zurückgibt. Infolgedessen bleibt die Webansicht nicht mehr an, bis die native Ausführung abgeschlossen ist. (Nicht für langjährige Aufgaben empfohlen)
// Kotlin
@NativeCall( CallType . FULL_SYNC )
fun searchContact ( contactFilter : ContactFilter ): List < Contact > {
return contactService.search(contactFilter)
} // Javascript
console . log ( Bridge . interfaces . Android . searchContact ( { surname : "Pitt" } ) ) Der CallType.WEB_PROMISE -Anruftyp funktioniert ähnlich wie der Aufruf FULL_SYNC , wobei der wichtigste Unterschied darin besteht, dass der JavaScript -Anruf ein Versprechen zurückgibt. Die native Android -Funktion wird jedoch weiterhin auf blockierende Weise aufgerufen. (Empfohlen, wenn Sie sich über die Aufgabendauer nicht sicher sind und in Zukunft möglicherweise auf FULL_PROMISE migrieren müssen)
// Kotlin
@NativeCall( CallType . WEB_PROMISE )
fun searchContact ( contactFilter : ContactFilter ): List < Contact > {
return contactService.search(contactFilter)
} // Javascript
Bridge . interfaces . Android . searchContact ( { surname : "Pitt" } ) . then ( ( list ) => {
console . log ( list ) ;
} ) ; Mit dem CallType.FULL_PROMISE -Anruftyp können Sie den nativen Android -Code in einem Hintergrund -Thread ausführen, sodass die Ausführung von JavaScript ununterbrochen fortgesetzt werden kann. Infolgedessen bleibt die Webansicht reaktionsschnell und frei, um ihre Aufgaben auszuführen. (Für langjährige Aufgaben empfohlen)
// Kotlin
@NativeCall( CallType . FULL_PROMISE )
fun searchContact ( contactFilter : ContactFilter ) = doInBackground< List < Contact >> { promise ->
try {
promise.resolve(contactService.search(contactFilter))
} catch (e : Exception ) {
promise.reject(e)
}
} // Javascript
Bridge . interfaces . Android . searchContact ( { surname : "Pitt" } ) . then ( ( list ) => {
console . log ( list ) ;
} ) ; Fügen Sie Maven zentral zum Repositoriesblock hinzu.
repositories {
google()
mavenCentral()
}Fügen Sie die Bibliothek dem Abhängigkeitsblock hinzu.
dependencies {
implementation ' com.github.andycandy-de:simple-android-bridge:1.1.1 '
} class AndroidNativeInterface : DefaultJSInterface ( " Android " ) {
@NativeCall( CallType . FULL_SYNC )
fun helloFullSync ( name : String ): String {
return " hello $name "
}
@NativeCall( CallType . WEB_PROMISE )
fun helloWebPromise ( name : String ): String {
return " hello $name "
}
@NativeCall( CallType . FULL_PROMISE )
fun helloFullPromise ( name : String ) = doInBackground< String > { promise ->
promise.resolve( " hello $name " )
}
} val bridge = Bridge (applicationContext, webView)
bridge.addJSInterface( AndroidNativeInterface ())Android -Code
// Bridge can be initialized by calling the 'init' function inside
// the 'onPageStarted' function of a WebViewClient
webView.webViewClient = object : WebViewClient () {
override fun onPageStarted ( view : WebView ? , url : String? , favicon : Bitmap ? ) {
bridge. init ()
}
}JavaScript -Code
// Bridge can be initialized by calling the 'init' function in
// Javascript. Register function to 'Bridge.afterInitialize' to
// start the webapp after the bridge is initialized.
function startApp ( f ) {
if ( Bridge . initialized ) {
f ( )
} else {
Bridge . afterInitialize = f
}
}
Bridge . init ( )
startApp ( ( ) => {
// Start your webapp
} ) ; console . log ( Bridge . interfaces . Android . helloFullSync ( "Web" ) ) MIT -Lizenz
Copyright (C) 2020 Andycandy-de
Copyright (C) 2021 Andycandy-de
Copyright (C) 2024 Andycandy-de
Die Erlaubnis wird hiermit einer Person, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (der "Software") erhält, kostenlos erteilt, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte, zu verwenden, zu kopieren, zu modifizieren, zusammenzufassen, zu veröffentlichen, zu veröffentlichen, zu verteilen, zu verteilt, und/oder Kopien der Software zu ermöglichen, um Personen zu beanstanden, an denen die Software zugänglich ist, um die folgenden Bedingungen zu beantragen.
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie es ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall sind die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen haftbar, sei es in einer Vertragsklage, unerbittlich oder auf andere Weise, die sich aus oder im Zusammenhang mit der Software oder anderen Geschäften in der Software ergeben.