Android Instant App: ¿Cómo crear módulos direccionables por URL?

Google ha actualizado su página de información sobre aplicaciones instantáneas recientemente: https://developer.android.com/topic/instant-apps/prepare.html

La mayoría de los puntos son claros excepto "3. Refactore su aplicación, si es necesario". Sugieren para los módulos al por menor como hojear, la búsqueda, detalle del artículo, y la comprobación hacia fuera.

P: ¿Cómo puedo dividir la aplicación en módulos que sean totalmente funcionales y direccionables por URL? Veo aquí varias cuestiones: – si usamos bibliotecas como dagger, butterknife, … todos los módulos dependen de otros módulos – si nuestros módulos contienen (vistas) según sea necesario, cómo debe una transición a otra vista (de otro módulo ) Ser implementado sin importar este módulo?

¿Puede alguien arrojar luz a la oscuridad? ¡Gracias!

Consulte los documentos oficiales ahora que Instant Apps está generalmente disponible para los desarrolladores.

Para resumir, todas las aplicaciones instantáneas tendrán por lo menos lo que se llama un módulo de función base que contiene código común a través de la aplicación instantánea. Además, Instant Apps puede tener opcionalmente 1 o más bibliotecas de características adicionales que dependen del módulo de características base. Cada módulo de características puede tener sus propios puntos de entrada que son direcciones URL, aunque los propios módulos de características no necesitan depender entre sí. Si uno necesita llamar al otro, eso puede hacerse a través de un Intención basada en URL.

El diagrama del sitio de docs ayuda un poco:

Introduzca aquí la descripción de la imagen

Todos los módulos de características utilizan el nuevo complemento com.android.feature , que se utiliza de manera similar al complemento tradicional com.android.library en términos de cómo se puede utilizar en su proyecto de Android y, por tanto, los documentos de la biblioteca se pueden utilizar como una referencia. En términos de cómo difiere, emitirá un archivo AAR regular cuando se use con su módulo de aplicación instalable y emitirá una característica APK cuando se use con el nuevo módulo de aplicación instantánea.

La separación adecuada de módulos requerida por Instant Apps se puede realizar fácilmente siguiendo estos pasos:

  1. Cree un módulo compartido que contendrá código y recursos que deben compartirse entre módulos de características.
  2. Cree varios módulos de características para cada característica principal (en el ejemplo proporcionado por Google: exploración, búsqueda, detalle del elemento y comprobación). Estos módulos pueden depender del módulo compartido creado en p.1, pero no deben saber nada sobre el otro.
  3. Para iniciar una actividad a partir de un módulo diferente, haga que la actividad objetivo sea direccionable por URL e iníciela por medio de una intención implícita. Google sugiere utilizar Enlaces de la aplicación para eso.
  4. Para crear tu aplicación Android normal, crea un módulo de aplicación que depende de los módulos de función.
  5. Una vez que Google publique su SDK de Android InstantApp al público, puede crear sus aplicaciones instantáneas (una por función).

Considere este diagrama. Introduzca aquí la descripción de la imagen

P: ¿Cómo puedo dividir la aplicación en módulos que sean totalmente funcionales y direccionables por URL?

Módulo base: contiene todos los recursos comunes requeridos por su aplicación. Así que en nuestro caso, todas las actividades de feature1 y feature2 estarían utilizando res compartido de base module.It puede tener bibliotecas como dagger, butterknife.

Ahora es el momento de romper toda tu aplicación en una unidad más pequeña llamada característica. Una sola característica puede consistir en múltiples actividades que sólo pueden dar una idea de su aplicación o lograr una meta que impulsa a los usuarios a instalar esa aplicación. Ahora todo depende de usted que lo que desea entregar al usuario que insisten en descargar su aplicación.

Feature1: Así que tenemos aplicación dividida en feature1 y feature2. En esta función1 estamos dando a los usuarios para buscar y buscar elementos. Siempre que el usuario haga clic en el elemento que tenemos que cargar el detalle de los elementos de feature2 por lo tanto, haga clic en el elemento de la actividad de exploración vamos a llamar como

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://yourdomain.com/itemdetail")); intent.setPackage(getPackageName()); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent); 

Porque: Activity1 de feature1 no puede llamar directamente Activity2 en feature2. Para hacerlo, debe solicitar la dirección URL de activity2 de activity1.

Feature2: Ahora, Feature2 cargado en la aplicación instantánea así que ahora podemos ver la actividad de los detalles del artículo.

NOTA: También debe considerar el tamaño de la función mientras se divide la funcionalidad de la aplicación porque cada característica no debe exceder el tamaño de 4 MB, de lo contrario se produce la validación mientras se carga apk para reproducir la tienda.

Creo que el módulo de la característica viene con todo debe concepto modular. Al final, cada característica se puede separar en el módulo de características.

Comienzo a entender la nueva forma de estructura del proyecto de esta charla . Me deja claro por algún punto.

Al igual que si creamos el módulo de características y queremos enlazar con el módulo de base de características, probablemente necesitamos eliminar los androidTest test y res androidTest no utilizados.

También crear proyecto simple con nueva estructura aquí

En este repos, intenta comenzar desde cero siguiendo el documento y encima para cambiar de módulo de aplicación a módulo de función y agregar módulo de aplicación instantánea en codebase.

No estoy seguro de si estoy malinterpretando su pregunta, pero intentaré darle un respiro. Para mi siguiente explicación, haré referencia a este ejemplo de código de Google varias veces. Sugiero ALTAMENTE la clonación de ese repo y jugar con él, ya que creo que va a responder a su pregunta.

Si usamos bibliotecas como dagger, butterknife, … todos los módulos serían dependientes de otros módulos

Como se ha mencionado por otros, las bibliotecas que serán utilizadas por todas sus características irán a su función de base.

Si nuestros módulos contienen (vistas) según sea necesario, ¿cómo debe implementarse una transición a otra vista (desde otro módulo) sin importar este módulo?

Esta respuesta cubre la visión general de ella – pero esta parte parece ser la raíz de su pregunta así que voy a tratar de cavar en un poco más profundo.

Digamos que Feature1 ( BrowseActivity ) quiere abrir Feature2 ( ItemDetailActivity ). En lugar de Feature1 llamar a startActivity(ItemDetailActivity.class) directamente, tendrá que usar la llamada de método a continuación (esto es porque Feature1 no tiene acceso a Feature2 ItemDetailActivity.class ya que no dependen entre sí). Aquí está el ejemplo de código proporcionado por Google

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com/itemdetail")); intent.setPackage(getPackageName()); intent.addCategory(Intent.CATEGORY_BROWSABLE); startActivity(intent); 

Ahora la parte que falta es que en el AndroidManifest de Feature2 debes declarar que ItemDetailActivity está escuchando el enlace https://example.com/itemdetail . Aquí está el ejemplo de código pertinente de Google

 <activity android:name=".ItemDetailActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="example.com" /> <!-- IMPORTANT --> <data android:pathPrefix="/itemdetail"/> </intent-filter> <meta-data android:name="default-url" android:value="https://www.example.com/itemdetail" /> </activity> 

Para más información, lea en Enlaces de activos digitales , así como enlaces profundos generales

  • Android AVD para Jelly Bean y API de Google -
  • Cómo ver los bytecodes de Dalvik para mi aplicación en Android Studio?
  • Android Studio - Gradle genera archivos javadoc específicos
  • Detectar la presión prolongada del botón de encendido
  • Android OrderedBroadcast No funciona en la versión de lanzamiento
  • El archivo .apk no existe en el disco pero sí
  • No puede instalar el repositorio y el proyecto de sincronización - no puede utilizar las bibliotecas de soporte 25.2.0
  • Android studio no renderizado vista previa del diseño
  • ¿Cómo evito que Android Studio colapse automáticamente mis paquetes en la navegación de proyectos?
  • Se requiere la versión Grad10 2.10. La versión actual es 2.8 Error
  • ¿Tiene Android Studio una herramienta de análisis de memoria como MAT en Eclipse?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.