Aplicación de desarrollo UTS en sistema Android

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-appuna 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:

  1. Al compilar: cuando guardamos UTSel archivo de código fuente, el IDE lo compilará sincrónicamente en el código Kotlin correspondiente.
  2. 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 UTSactualmente 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.

# 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 Numbertipos y no Inthay 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

MutableListEs androidun 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 MutableListtipo 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 MutableListpara 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

kotlinLa variable variable in se modifica como  var, val. La diferencia es que val es inmutable y var es mutable.

utsvarEl tipo de variable  correspondiente envar/let

Se recomienda su uso let porque solo tendrá efecto dentro del alcance, y debe usarse con precaución varporque tiene un alcance de acción más amplio.

# 4.1.3 Definición del método

kotlinSolo 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

kotlinEn: operador de herencia, necesita ser extendsreemplazado 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

kotlinLas 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

Supongo que te gusta

Origin blog.csdn.net/std7879/article/details/127672569
Recomendado
Clasificación