Bangun jembatan! Integrasi yang mulus antara Android dan Webapps
Bangun jembatan yang kuat antara Android dan Webapp Anda dengan Perpustakaan SimpleandroidBridge. Perpustakaan ini memungkinkan Anda untuk membuat aplikasi web di Webview Android dan membuat JSInterface untuk memungkinkan komunikasi yang lancar antara kedua platform. Bagikan objek yang kompleks, janji, dan fungsi panggilan balik, semua sementara aplikasi web Anda tetap responsif dan efisien.
✓ Bagikan Objek - Android ⇄ Web
✓ Bagikan Janji - Android ⇄ Web
✓ Fungsi panggilan balik - Android ← Web
✓ Fungsi panggilan non -blocking - Android ⇄ Web
✓ Ketik keamanan dengan naskah - android + web
Jembatan JavaScript bawaan di Android SDK hanya mendukung tipe primitif. Dengan SimpleandroidBridge, Anda dapat berbagi objek yang kompleks antara Android dan Web dengan mudah. Cukup tentukan tipe sebagai argumen atau mengembalikan nilai dalam fungsi asli Android Anda, dan perpustakaan akan secara otomatis mengonversi objek JavaScript ke objek Kotlin dan sebaliknya.
// 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" } ) )Jembatan JavaScript di Android SDK menjalankan fungsi dengan cara pemblokiran, menyebabkan aplikasi web membeku sampai fungsi asli kembali. Namun, dengan perpustakaan ini, Anda dapat mendefinisikan jenis pengembalian janji, memungkinkan eksekusi yang tidak blokir. Dengan memanfaatkan fungsi 'doinbackground', kode Android dieksekusi dalam utas latar belakang, mencegah aplikasi web diblokir.
// 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 ) ;
} ) ;Jika Anda terbiasa dengan JavaScript, Anda mungkin tidak asing dengan fungsi panggilan balik. SimpleAndroidBridge mengambil konsep ini selangkah lebih maju, memungkinkan Anda untuk menyuntikkan fungsi panggilan balik JavaScript ini langsung ke lapisan Android, sehingga menciptakan interaksi yang mulus antara aplikasi web Anda dan Android.
// 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!" )
} ) Untuk meneruskan argumen ke fungsi JavaScript, gunakan tipe JSFunctionWithArg , yang secara khusus dirancang untuk menerima argumen.
// 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 )
} )Untuk meneruskan beberapa argumen ke suatu fungsi, pertimbangkan untuk membuat kelas data.
Untuk fungsi yang perlu mengembalikan hasil ke lapisan Android, Anda dapat menggunakan JSFunctionWithPromise untuk fungsi tanpa argumen atau JSFunctionWithPromiseAndArg untuk fungsi yang menerima argumen.
// 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 ) } )
} )CATATAN
Untuk melepaskan JSFunction dan menghapus ikatannya, cukup panggil fungsi close . JSFunction mengimplementasikan antarmuka AutoCloseable , memungkinkan Anda untuk menggunakan blok percobaan-dengan-sumber daya atau AutoCloseable.use {} blok untuk secara otomatis mengelola siklus hidup fungsi dan memastikan pembersihan yang tepat.
function.use { it() } Selain itu, jika aplikasi web atau WebView Anda mendukung pemuatan ulang, disarankan untuk menambahkan afteritializeListener ke jembatan. Pendengar ini akan membantu melepaskan JSFunctions yang tersedia, memastikan keadaan bersih setelah inisialisasi.
Perpustakaan ini mendukung berbagai jenis panggilan asli yang memungkinkan Anda memutuskan cara memanggil kode asli.
Jenis panggilan CallType.FULL_SYNC memanggil kode asli dengan cara pemblokiran, menyebabkan eksekusi JavaScript berhenti sampai fungsi Android asli kembali. Akibatnya, tampilan web tetap tidak responsif sampai eksekusi asli selesai. (Tidak direkomendasikan untuk tugas yang sudah berjalan lama)
// Kotlin
@NativeCall( CallType . FULL_SYNC )
fun searchContact ( contactFilter : ContactFilter ): List < Contact > {
return contactService.search(contactFilter)
} // Javascript
console . log ( Bridge . interfaces . Android . searchContact ( { surname : "Pitt" } ) ) CallType.WEB_PROMISE Tipe Panggilan Fungsi mirip dengan panggilan FULL_SYNC , dengan perbedaan utama adalah bahwa panggilan JavaScript mengembalikan janji. Namun, fungsi Android asli masih dipanggil dengan cara pemblokiran. (Direkomendasikan jika Anda tidak yakin tentang durasi tugas dan mungkin perlu bermigrasi ke FULL_PROMISE di masa depan)
// 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 ) ;
} ) ; Jenis panggilan CallType.FULL_PROMISE memungkinkan Anda untuk menjalankan kode Android asli di utas latar belakang, yang memungkinkan eksekusi JavaScript untuk melanjutkan tanpa gangguan. Akibatnya, tampilan web tetap responsif dan bebas melakukan tugasnya. (Direkomendasikan untuk tugas yang sudah berjalan lama)
// 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 ) ;
} ) ; Tambahkan Maven Central ke blok repositori.
repositories {
google()
mavenCentral()
}Tambahkan pustaka ke blok dependensi.
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 ())Kode Android
// 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 ()
}
}Kode JavaScript
// 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" ) ) Lisensi MIT
Hak Cipta (C) 2020 Andycandy-de
Hak Cipta (C) 2021 Andycandy-de
Hak Cipta (C) 2024 Andycandy-de
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus dimasukkan dalam semua salinan atau bagian substansial dari perangkat lunak.
Perangkat lunak ini disediakan "sebagaimana adanya", tanpa jaminan apa pun, tersurat maupun tersirat, termasuk tetapi tidak terbatas pada jaminan dapat diperjualbelikan, kebugaran untuk tujuan tertentu dan nonpringement. Dalam hal apa pun penulis atau pemegang hak cipta tidak akan bertanggung jawab atas klaim, kerusakan atau tanggung jawab lainnya, baik dalam tindakan kontrak, gugatan atau sebaliknya, timbul dari, di luar atau sehubungan dengan perangkat lunak atau penggunaan atau transaksi lain dalam perangkat lunak.