para Android
Este artículo tiene como objetivo ayudar a los desarrolladores de Android a comenzar a usar UTS rápidamente.
Se requiere que los lectores tengan experiencia en el desarrollo de aplicaciones nativas de Android.
# 1 Comprender qué es el complemento UTS
UTS插件
Es uni-app
una nueva forma de complemento, que tiene las ventajas de multiplataforma, alta eficiencia y fácil depuración. Detalles (se abre en una ventana nueva)
Para los desarrolladores de Android, lo que necesitamos saber es:
- Al compilar: cuando guardamos
UTS
el archivo de código fuente, el IDE lo compilará sincrónicamente en el código Kotlin correspondiente. - Tiempo de ejecución: cuando la máquina real se está ejecutando/empacando en la nube, estos códigos fuente compilados de Kotlin también se convertirán en parte del apk
# 2 Domina la gramática UTS
# 2.1 Para los que dominan el lenguaje kotlin
Debido a que la sintaxis UTS es muy similar a kotlin, se recomienda dominar la sintaxis UTS en la práctica después de una lectura rápida. Introducción a la sintaxis de uts (se abre en una ventana nueva) .
# 2.2 Para los que solo dominan el lenguaje java
En comparación con js, la sintaxis de uts es más similar a java. Sin embargo, todavía hay grandes diferencias, y necesita leer la sección de gramática 2.3 en detalle.
Aunque el desarrollo de complementos UTS no requiere dominar kotlin, pero dado que UTS
actualmente se encuentra en la plataforma Android, se compilará en el código fuente de kotlin. Aprenda el lenguaje kotlin para facilitar la resolución de problemas y la implementación de funciones complejas.
Por lo tanto, se recomienda aprender la sintaxis de kotlin.
-
kotlin https://kotlinlang.org/(se abre en una ventana nueva)
-
kotlin para Android https://developer.android.com/kotlin(se abre en una ventana nueva)
# 2.3 Diferencias de tipos de datos
Aunque UTS y koltin son básicamente consistentes en los tipos de datos, todavía hay diferencias en algunos escenarios, que se explican específicamente aquí.
En principio:
El tipo de datos está sujeto al tipo incorporado de UTS, y cada plataforma nativa se adaptará automáticamente a él.
Sin embargo, UTS en sí mismo es un lenguaje multiplataforma, cuando la API de una plataforma específica tiene requisitos claros, prevalecerá el tipo de datos claramente requerido por la otra parte.
#Ejemplo 1: Int y Número
De forma predeterminada, UTS
los desarrolladores pueden utilizar Number
superposiciones para las escenas android
utilizadas en la plataforma Int
.
Pero cuando el desarrollador reescribe Service
el onStartCommand
método del componente, Android
los requisitos de la API requieren claramente que los dos últimos parámetros sean Int.
En el entorno de desarrollo nativo, debería escribirse así:
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
return super.onStartCommand(intent, flags, startId);
}
Copiar código
En el entorno estándar de TS, solo hay Number
tipos y no Int
hay tipos.
Para adaptarse a esta situación, UTS permite a los desarrolladores utilizar el tipo de datos Int de la plataforma nativa para cumplir con los requisitos de tipo de datos de la API nativa:
override onStartCommand(intent:Intent ,flags:Int ,startId:Int):Int {
return super.onStartCommand(intent, flags, startId);
}
Copiar código
#Ejemplo 2:MutableList
MutableList
Es android
un tipo de datos específico de la plataforma. En escenarios generales, puede ser Array
reemplazado por el tipo integrado en UTS.
Sin embargo, al llamar onAppActivityRequestPermissionsResult
a la función para monitorear el resultado de la solicitud de permiso, se requiere explícitamente usar este tipo de parámetro
En el entorno nativo, debería escribirse así:
onAppActivityRequestPermissionsResult(fun(requestCode: Number, permissions: MutableList<String>, grantResults: MutableList<Number>){
});
Copiar código
En el entorno estándar de TS, no hay ningún MutableList
tipo y el tipo de datos similar es Array
Para adaptarse a esta situación, UTS permite a los desarrolladores utilizar los tipos de datos de la plataforma nativa MutableList
para cumplir con los requisitos de tipos de datos de la API de la plataforma nativa:
onAppActivityRequestPermissionsResult((requestCode: number,permissions: MutableList<string>,grantResults: MutableList<number>) => {
});
Copiar código
# 3 Configuración del entorno nativo de Android
Para los proyectos de Android, además del código fuente, también involucra problemas comunes como dependencias, recursos y configuraciones.
Este capítulo presentará cómo configurar estas propiedades en el entorno de desarrollo del complemento UTS.
Aviso:
- 1 Los códigos de ejemplo en este capítulo se tomaron de la dirección del proyecto Hello UTS (se abre en una ventana nueva)
- 2 La configuración diseñada en este capítulo solo puede tener efecto después de personalizar la base
- 3 A partir de HX 3.6.8, la generación automática de archivos R aún no es compatible, por lo que la parte involucrada en la generación de archivos R en este capítulo aún no es compatible. Este es un problema heredado y se admitirá en una versión posterior.
# 3.1 Configurar AndroidManifest.xml
Tome el archivo de configuración en el complemento de la página nativa en hello UTS como ejemplo:
Ubicación de archivo de ejemplo en hello uts:
~\uni_modules\uts-nativepage\utssdk\app-android\AndroidManifest.xml
Ejemplo de AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
// 配置包名
package="io.dcloud.uni_modules.uts_nativepage">
// 配置权限
<!--创建前台服务权限-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application>
// 配置service / activity
<service android:name="uts.sdk.modules.utsNativepage.ForeService" />
<activity android:name="uts.sdk.modules.utsNativepage.DemoActivity"></activity>
</application>
</manifest>
Copiar código
Las reglas de configuración de AndroidManifest.xml son consistentes con las de Android.
Nota especial:
Cada complemento UTS corresponde a un módulo lib en el proyecto de Android.
A diferencia de ingresar manualmente el nombre del paquete en Android Studio, si no tiene un nombre de paquete manual, HX generará uno de manera predeterminada de acuerdo con las siguientes reglas:
uts插件默认包名规则:
如果是根目录utssdk下的uts插件
包名:uts.sdk.(插件ID转驼峰)
如果是uni_modules目录下的uts插件
包名:uts.sdk.modules.(插件ID转驼峰)
举例:
uni-getbatteryinfo -> uts.sdk.modules.uniGetbatteryinfo;
uts-nativepage -> uts.sdk.modules.utsNativepage
Copiar código
# 3.2 Configurar recursos de resolución
Ubicación de archivo de ejemplo en hello uts:
~\uni_modules\uts-nativepage\utssdk\app-android\res
Además de los directorios de diseño y valores enumerados aquí, también es compatible con todos los directorios de recursos estándar de Android, como anim
# 3.3 Configurar recursos de activos
Tome el complemento uts-advance en hello UTS como ejemplo.
clave:
// 获取asset管理器
let assetManager = getAppContext()!.getAssets();
// 加载free.mp3 资源
let afd = assetManager.openFd("free.mp3");
// 使用android 自带的媒体组件进行播放
let mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(), afd.getLength());
mediaPlayer.prepare();
mediaPlayer.start();
Copiar código
La ubicación del código completo en hello uts:
~\uni_modules\uts-advance\utssdk\app-android\activos
# 3.4 Agregar recursos dependientes de libs
Tome el complemento uts-tencentgeolocation en el proyecto Hello UTS como ejemplo
Ubicación de archivo de ejemplo en hello uts:
~\uni_modules\uts-tencentgeolocalización\utssdk\app-android\libs
La versión HX3.6.7 tiene las siguientes dependencias integradas
Los desarrolladores deben prestar atención a dos puntos al usar las dependencias de la lista:
- Cuando la máquina real se está ejecutando, puede hacer referencia directamente a las clases relacionadas sin agregar dependencias en la lista
- No introduzca las mismas dependencias agregando jar/aar manualmente, de lo contrario, el empaquetado en la nube fallará debido a conflictos de dependencia.
+--- my-imageloader.jar
+--- my-nineoldandroids-2.4.0.jar
+--- zip4j-2.8.0.jar
+--- uts-runtime-jvm-1.0.jar
+--- [email protected]
+--- msa_mdid_1.0.13.aar
+--- breakpad-build-release.aar
+--- androidx.multidex:multidex:2.0.0@aar
+--- androidx.recyclerview:recyclerview:1.0.0@aar
+--- androidx.legacy:legacy-support-v4:1.0.0@aar
+--- androidx.appcompat:appcompat:1.0.0@aar
+--- com.github.bumptech.glide:glide:4.9.0@aar
+--- com.alibaba:fastjson:1.1.46.android@jar
+--- androidx.fragment:fragment:1.0.0@aar
+--- androidx.vectordrawable:vectordrawable-animated:1.0.0@aar
+--- androidx.legacy:legacy-support-core-ui:1.0.0@aar
+--- androidx.media:media:1.0.0@aar
+--- androidx.legacy:legacy-support-core-utils:1.0.0@aar
+--- androidx.vectordrawable:vectordrawable:1.0.0@aar
+--- androidx.viewpager:viewpager:1.0.0@aar
+--- androidx.coordinatorlayout:coordinatorlayout:1.0.0@aar
+--- androidx.drawerlayout:drawerlayout:1.0.0@aar
+--- androidx.slidingpanelayout:slidingpanelayout:1.0.0@aar
+--- androidx.customview:customview:1.0.0@aar
+--- androidx.swiperefreshlayout:swiperefreshlayout:1.0.0@aar
+--- androidx.asynclayoutinflater:asynclayoutinflater:1.0.0@aar
+--- androidx.loader:loader:1.0.0@aar
+--- androidx.core:core:1.0.0@aar
+--- androidx.versionedparcelable:versionedparcelable:1.0.0@aar
+--- androidx.collection:collection:1.0.0@jar
+--- androidx.cursoradapter:cursoradapter:1.0.0@aar
+--- com.github.bumptech.glide:gifdecoder:4.9.0@aar
+--- androidx.lifecycle:lifecycle-runtime:2.0.0@aar
+--- androidx.interpolator:interpolator:1.0.0@aar
+--- androidx.documentfile:documentfile:1.0.0@aar
+--- androidx.localbroadcastmanager:localbroadcastmanager:1.0.0@aar
+--- androidx.print:print:1.0.0@aar
+--- androidx.lifecycle:lifecycle-viewmodel:2.0.0@aar
+--- androidx.lifecycle:lifecycle-livedata:2.0.0@aar
+--- androidx.lifecycle:lifecycle-livedata-core:2.0.0@aar
+--- androidx.lifecycle:lifecycle-common:2.0.0@jar
+--- androidx.arch.core:core-runtime:2.0.0@aar
+--- androidx.arch.core:core-common:2.0.0@jar
+--- androidx.annotation:annotation:1.0.0@jar
+--- com.github.bumptech.glide:disklrucache:4.9.0@jar
\--- com.github.bumptech.glide:annotations:4.9.0@jar
Copiar código
# 4 Diferencias clave entre Kotlin y UTS (actualización continua)
Lea los capítulos anteriores.
Hasta ahora, creemos que domina la sintaxis UTS, la sintaxis básica de Kotlin y la compatibilidad con UTS para los recursos de Android.
Pero para un usuario del lenguaje kotlin que está familiarizado con el desarrollo de Android, hay muchos hábitos comunes que han cambiado. Lo señalaremos específicamente en este capítulo, para que los desarrolladores puedan profundizar su comprensión.
# 4.1 Diferencias de sintaxis
# 4.1.1 Banderas de sintaxis anulable
En kotlin, la sintaxis anulable se unifica como un tipo y luego se agrega ?
. Tome el siguiente código como ejemplo
// 一个可为空的字符串变量,变量名为user
var user:String? = null
Copiar código
Pero hay dos casos en ts, si es una variable global, puede estar vacía, debe escribir así
let user:string | null
Copiar código
Si es una variable miembro, es similar a kotlin, pero la diferencia es que ?se escribe después de la variable, no después del tipo
let user?:string
Copiar código
# 4.1.2 let y var
kotlin
La variable variable in se modifica como var
, val
. La diferencia es que val es inmutable y var es mutable.
uts
var
El tipo de variable correspondiente envar/let
Se recomienda su uso let
porque solo tendrá efecto dentro del alcance, y debe usarse con precaución var
porque tiene un alcance de acción más amplio.
# 4.1.3 Definición del método
kotlin
Solo hay una forma de definir un método en una definición de método
fun startListener():void{
}
Copiar código
En uts, es necesario distinguir entre métodos globales y métodos miembro.
// 成员方法
startListener():void{
}
Copiar código
// 全局方法
function startListener():void{
}
Copiar código
# 4.1.4 se extiende
kotlin
En: operador de herencia, necesita ser extends
reemplazado con
gramática | kotlin | Ud. |
---|---|---|
clase de herencia | : | extiende |
implementar la interfaz | : | extiende |
class MediaContentObserver : ContentObserver {
}
Copiar código
class MediaContentObserver extends ContentObserver {
}
Copiar código
# 4.1.5 Aserción no nula
La afirmación no nula en kotlin es !!
, en ts es a!
user!.sayHello();
Copiar código
user!!.sayHello();
Copiar código
# 4.1.6 Llamar rápidamente a la implementación de la clase padre
//ts 中快速实现super
constructor() : super() {
}
Copiar código
//kotlin 中快速实现super
constructor (){
super();
}
Copiar código
# 4.1.7 Clase interna anónima
kotlin
Las clases internas anónimas se pueden utilizar en
// kotlin 新建事件监听
user.setListener(Listener(){
//todo
});
Copiar código
La versión actual de UTS no admite clases internas anónimas y requiere declaraciones explícitas para crear otras nuevas.
// 声明一个新的类,实现Listener
class MyListener extends Listener{
// todo
}
// 新建实例
let myListener = new MyListener();
user.setListener(myListener);
Copiar código
# 4.1.8 Puede ser llamado por una función vacía
Hay un escenario especial en el que necesitamos definir algunas variables de función que aceptan valores NULL, como éxito y error a continuación:
type Option = {
success?: (res: object) => void;
fail?: (res: object) => void;
};
Copiar código
En este momento tenemos que llamar así
options.success?.(res)
Copiar código
Tal método de llamada es ilegal en kotlin y pertenece a la sintaxis única en TS, que requiere atención especial.
# 4.2 Optimización de advertencias
Lo siguiente no afectará el uso funcional, pero en un entorno UTS, existen soluciones adecuadas
# 4.2.1 Introducción del paquete java lang
kotlin
O java
java.lang.* se trata especialmente y se puede usar directamente sin importar.
// 获取当前时间戳
System.currentTimeMillis()
Copiar código
En el entorno UTS, el paquete lang no recibe un trato especial y debe importarse manualmente.
// 手动引入lang包下的类
import System from 'java.lang.System';
// 获取当前时间戳
System.currentTimeMillis()
Copiar código
# 4.2.2 UTS
No se recomienda la construcción de atajos
kotlin
Admite el método de () para realizar rápidamente la declaración del constructor sin argumentos
// 获取当前时间戳
class ScreenReceiver extends BroadcastReceiver(){
}
Copiar código
En el entorno UTS, no se recomienda hacer esto (aunque no afectará la compilación en este momento), se recomienda utilizar la declaración manual de construcción sin argumentos.
class ScreenReceiver extends BroadcastReceiver{
constructor (){
super();
}
}
Copiar código
# Las variables prefijadas con un guión bajo en 4.2.3 UTS
tienen el significado de proteger las advertencias no utilizadas
// IDE会提示 name,status,desc 变量未使用
onStatusUpdate(name:string, status:Int, desc:string){
}
// 不会警告变量未使用
onStatusUpdate(_name:string, _status:Int, _desc:string){
}
Copiar código
# 5 Preguntas Frecuentes (continuamente actualizadas)
# 5.1 ¿Cómo crear uno nuevo en el entorno UTS activity
?
Consulte el complemento uts-nativepage en el proyecto Hello UTS
camino:
~\uni_modules\uts-nativepage
# 5.2 ¿Cómo crear uno nuevo en el entorno UTS service
?
Consulte el complemento uts-nativepage en el proyecto Hello UTS
camino:
~\uni_modules\uts-nativepage