Artículos de la serie de componentes Android Jetpack: Componente
Android Jetpack (1) Componente LifeCycle
Android Jetpack (2) Navegación
Componente Android Jetpack (3) ViewModel Componente
Android Jetpack (4) LiveData Componente
Android Jetpack (5)
Componente Room Android JetPack (6) Enlace de datos
Android Jetpack Componentes (7) Paginación de
componentes de Android Jetpack (8) WorkManager
Primer idioma
¡El 4 de marzo, Google lanzó Flutter 2 ! Como una actualización importante de Flutter, los desarrolladores que usan Flutter 2 pueden usar el mismo código para publicar aplicaciones desarrolladas con Flutter en cinco sistemas operativos: iOS, Android, Windows, macOS y Linux; y en la web. versión que se ejecuta en navegadores como Chrome, Firefo, Safari o Edge, Flutter puede incluso integrarse en automóviles, televisores y electrodomésticos inteligentes.
Como desarrollador de Flutter, inmediatamente descargué el Flutter 2.0 sdk y ejecuté mi proyecto Flutter en Chrome. El efecto fue muy bueno, pero hubo algunas diferencias en el código, el lado web no admitía imágenes y el paquete io de dart, etc. Puedes consultar las diferencias específicas en el sitio web oficial de Flutter . Publique una representación del lado web.
Introducción
En la conferencia Google I / O en 2017, Google lanzó AAC (Componentes de arquitectura de Android), que incluye componentes diseñados específicamente para arquitectura como LiveData, ViewModel y Room. AAC también se puede utilizar como predecesor de Jetpack. En la Conferencia de E / S de Google de 2018, Google lanzó Jetpack sobre la base de AAC.
Jetpack es un conjunto de múltiples bibliotecas que puede ayudar a los desarrolladores a seguir las mejores prácticas, reducir el código repetitivo y escribir código que se pueda ejecutar de manera consistente en varias versiones y dispositivos de Android, lo que permite a los desarrolladores concentrarse en escribir código importante.
Jetpack incluye principalmente los siguientes cuatro aspectos, a saber, arquitectura (Arquitectura), interfaz (UI), comportamiento (Comportamiento) y fundamento (Fundamento).
- Los componentes de la arquitectura pueden ayudarlo a diseñar aplicaciones robustas, probables y fáciles de mantener.
- Los componentes de Foundation proporcionan funciones de dominio cruzado, como compatibilidad con versiones anteriores, pruebas y compatibilidad con el lenguaje Kotlin.
- Los componentes Ul proporcionan widgets y ayudantes, lo que hace que la aplicación no solo sea fácil de usar, sino también agradable de usar.
- El componente de comportamiento ayuda a las aplicaciones a integrarse con los servicios estándar de Android, como notificaciones, permisos, uso compartido y asistentes.
El componente Arquitectura es el centro de nuestra atención. A continuación, comenzará a aprender sobre los componentes. La imagen de abajo es cuando se lanzó Jetpack por primera vez. Ahora Jetpack tiene más componentes que los de la imagen. Consulte todas las bibliotecas de Android Jetpack para obtener componentes detallados .
ventaja
- Siga las mejores prácticas. Los
componentes de Android Jetpack están construidos con los últimos métodos de diseño, son compatibles con versiones anteriores y pueden reducir los bloqueos y las pérdidas de memoria. - Elimine el código repetitivo
Android Jetpack puede administrar todo tipo deActivity
tareas engorrosas (como tareas en segundo plano, navegación y administración del ciclo de vida) para que pueda concentrarse en crear excelentes aplicaciones. - Reduzca las inconsistencias.
Estas bibliotecas funcionan de manera uniforme en todas las versiones y dispositivos de Android, lo que lo ayuda a reducir la complejidad.
Descripción general de AndroidX
Los artefactos en el espacio de nombres de AndroidX incluyen la biblioteca de Android Jetpack. Al igual que la biblioteca de soporte, las bibliotecas en el espacio de nombres de AndroidX se proporcionan por separado de la plataforma Android y son compatibles con varias versiones de Android.
Si desea migrar el proyecto a AndroidX, seleccione Refactorizar—> Migrar a AndroidX en la barra de menú de Android Studio. Una vez completado, abra el archivo gradle.properties, puede ver estas dos líneas de código:
# 表示是否使用AndroidX
android.useAndroidX=true
# 表示是否将第三方库迁移到AndroidX
android.enableJetifier=true
Para la nueva versión de Android Studio, AndroidX ya es compatible de forma predeterminada y las operaciones anteriores no son necesarias.
Ciclo vital
A menudo necesitamos onCreate()
inicializar los componentes en el medio de la página onPause()
, detener los componentes en el onDestory()
medio y reciclar los componentes en el medio. Tal trabajo es engorroso y el código es difícil de mantener, y también puede causar pérdidas de memoria.
Para ello, Google ofrece LifeCycle como solución. LifeCycle puede ayudar a los desarrolladores a reanudar los componentes que tienen en cuenta el ciclo de vida. Al utilizar componentes que tienen en cuenta el ciclo de vida, puede mover el código que depende del componente del método del ciclo de vida al componente en sí, lo que reduce el acoplamiento entre los módulos y la posibilidad de fugas de memoria. Escribe código más optimizado y fácil de mantener.
Principio del ciclo de vida
El ciclo de vida es una clase para almacenar componentes relacionados (por ejemplo, Activity
o el Fragment
estado del ciclo de vida de la información) y para permitir que otros objetos observen este estado.
El ciclo de vida utiliza dos enumeraciones principales para realizar un seguimiento del estado del ciclo de vida de sus componentes asociados:
- Evento (Evento)
del marco yLifecycle
eventos del ciclo de vida de la clase despachada. Estos eventos se asignan a lasActivity
yFragment
los eventos de devolución de llamada.
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
- Estado (estado)
El estado actual del componente rastreado por el objeto de ciclo de vida.
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
//比较此状态是否大于或等于给定状态
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
Todos estos se pueden ver en el código fuente de la clase Lifecycle, como se muestra en la siguiente figura.
Jetpack nos proporciona dos clases: LifeCycleOwner
(observado) y LifeCycleObserver
(observador). Supervise el ciclo de vida de la página a través del modo de observador.
Podemos ComponentActivity
ver en el código fuente que implementa la LifecycleOwner
interfaz y solo hay una interfaz getLifeCycle()
LifeCycle implementa el modo observador a través de este método El código fuente ya tiene implementada la parte que realiza el observador.
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
Escuchamos Atctivity
cuando el ciclo de vida, solo para darnos cuenta de que parte del visor de código que permite que los componentes personalizados logren LifecycleObserver
la interfaz puede ser.
public class MyObserver implements LifecycleObserver {
//当Activity执行onResume()时,该自动调用
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
...
}
}
En Activity
, solo necesita usar el siguiente código para vincular el observador y lo observado, y ya no debe preocuparse Activity
por el impacto de los cambios en el ciclo de vida del componente.
getLifecycle().addObserver(new MyObserver());
LifecycleService
Además de Android Activity
y Fragment
tiene un ciclo de vida, hay un componente importante Service
para la conveniencia del Service
ciclo de vida de escucha, Android proporciona una LifecycleService
clase que hereda Service
e implementa la LifecycleOwner
interfaz. Y Activity
y Fragment
similares, también hay una getLifecycle()
para nosotros llamamos, como parte del código fuente.
public class LifecycleService extends Service implements LifecycleOwner {
private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher(this);
@Override
@NonNull
public Lifecycle getLifecycle() {
return mDispatcher.getLifecycle();
}
}
Al usar LifecycleService
, necesitamos agregar las siguientes dependencias:
implementation "androidx.lifecycle:lifecycle-service:2.3.0"
El uso Activity
es similar al del Service
medio, vincular al observador en el Observer
medio y darse cuenta de la vinculación del evento en la personalización . Úselo LifecycleService
bien para darse cuenta del Service
desacoplamiento entre componentes y administrar los cambios provocados por el ciclo de vida internamente.
ProcessLifecycleOwner
Además de los componentes con un ciclo de vida Activity
, Fragment
y los Service
hay Application
. Muchas veces queremos saber si la aplicación está en primer plano o en segundo plano, o cuando el fondo vuelve al primer plano para recibir notificaciones. Para ello, LifeCycle proporciona una ProcessLifecycleOwner
clase que nos facilita conocer el ciclo de vida de toda la aplicación.
Al usar ProcessLifecycleOwner
, necesitamos agregar las siguientes dependencias:
implementation "androidx.lifecycle:lifecycle-process:2.3.0"
ProcessLifecycleOwner
El método de uso es similar al de Activity
, Fragment
y Service
su esencia es el modo de observador, en el Application
que el observador Observer
está vinculado y el evento está vinculado a la costumbre .
Con esto ProcessLifecycleOwner
, podemos obtener fácilmente los cambios en el ciclo de vida de la aplicación, realizar algunas operaciones comerciales en ella y reducir el acoplamiento del código del proyecto. Pero cabe señalar que:
ProcessLifecyoleowner
Es para el seguimiento de toda la aplicación yActivity
no tiene nada que ver con la cantidad.Lifecycle.Event.ON CREATE
Solo se llamará una vez yLifecycle.Event.ON_DESTROY
nunca se llamará.- Cuando la aplicación vuelva al primer plano desde el fondo, o cuando la aplicación se abra por primera vez, a su vez llamará
Lifecycle.Event.ON_START
yLifecycle.Event.ON_RESUME
. - Cuando la aplicación se retira de la recepción (o el usuario presiona la tecla del menú de tareas de la tecla Inicio), a su vez llamará
Lifecycle.Event.ON PAUSE
yLifecycle.Event.ON_ STOP
.
Evento ON_STOP
Si Lifecycle
pertenece a AppCompatActivity
o Fragment
, entonces llame AppCompatActivity
o Fragment
la onSaveInstanceState()
hora, Lifecycle
el estado cambia CREATED
y envía ON_STOP
eventos. FragmentActivity
Puedes verlo en el código fuente.
markFragmentsCreated();
mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
private void markFragmentsCreated() {
boolean reiterate;
do {
reiterate = markState(getSupportFragmentManager(), Lifecycle.State.CREATED);
} while (reiterate);
}
private static boolean markState(FragmentManager manager, Lifecycle.State state) {
boolean hadNotMarked = false;
Collection<Fragment> fragments = manager.getFragments();
for (Fragment fragment : fragments) {
if (fragment == null) {
continue;
}
if (fragment.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
fragment.mLifecycleRegistry.setCurrentState(state);
hadNotMarked = true;
}
if (fragment.getHost() != null) {
FragmentManager childFragmentManager = fragment.getChildFragmentManager();
hadNotMarked |= markState(childFragmentManager, state);
}
}
return hadNotMarked;
}
Después de onSaveInstanceState()
guardar AppCompatActivity
el estado de Fragment o , su interfaz se considera inmutable hasta que se llama ON_START
. Si intenta modificar la interfaz después de guardar el estado, es probable que se produzca una aplicación inconsistente del estado de navegación, por lo que la aplicación se está ejecutando en el estado de conservación FragmentTransaction
, FragmentManager
se lanza la excepción.
AppCompatActivity
El onStop()
testamento onSaveInstanceState()
después de la llamada, que dejaría un hueco, que no permite que el estado de la interfaz cambie, pero Lifecycle
aún no se ha movido al CREATED
estado.
Para evitar este problema, beta2 y anteriores en la Lifecycle
clase se marcarán ya que el estado CREATED
no envía eventos, de modo que, incluso si no envía un evento (hasta la llamada al sistema onStop()
), verifique el estado actual del código y obtendrá el valor real. .
ejemplo
- Cambiar entre actualizaciones de ubicación.
- Iniciar y detener el almacenamiento en búfer de video.
- Inicie y detenga la conexión de red.
- Pausa y reanuda los recursos dibujables de la animación.