Diseño de arquitectura Android – ¿Cómo hacerlo bien?

¿Cómo se ve una buena arquitectura para una aplicación para Android? ¿Debe realizarse toda la "lógica de trabajo / negocio" en un servicio de fondo y la Actividad se comunica sólo con el servicio para consultar / extraer datos desde algún lugar (local / distante)?

¿Implementarías el "servicio" que la Actividad llama como un verdadero servicio Android? O un POJO-Singleton que hace el trabajo (tal vez utilizando hilos de fondo). O instanciar los subprocesos de fondo en su actividad para las acciones que consumen mucho tiempo (consulte un servicio web).

¿Cómo se abstrae su acceso a los datos de la manera correcta? ¿Utilizarías un ContentProvider para acceder / abstraer tus datos? ¿Cómo / De dónde debe ser consultado? ¿Actividad? ¿Servicio? ..?

He intentado buscar un buen diseño de arquitectura de aplicaciones, pero solo he encontrado cómo se ve la arquitectura de Android, no cómo debería ser una aplicación de Android.

Entonces, ¿cuál es su opinión sobre eso? ¿Qué componentes de una aplicación de Android deben comunicarse entre sí para garantizar la mejor extensibilidad / encapsulación, …?

No hay una respuesta a esta pregunta. Un buen diseño de OO no es específico de Android. Yo diría que la regla es – si el marco le da un objeto de alto nivel (como el servicio en el caso de Android) que se adapte a su caso de uso, lo utilizan. Si usted se encuentra haciendo implementaciones POJO de las mismas cosas que obtiene de forma gratuita con el marco, vaya con el marco.

En cuanto a la separación de las preocupaciones, esto es estándar OO cosas. No ponga nada en sus clases de actividad que no sea el trabajo de la actividad. Sobrecargar la Actividad con métodos y propiedades que la Actividad necesita pero no son realmente el trabajo de la Actividad es malo – hace que la intención de su Actividad sea difícil de entender.

Por lo general, separar las cosas en sub-paquetes en mis aplicaciones.

  • Com.myname.myproject.app – clases base, funcionalidad de aplicación global
  • Com.myname.myproject.net – cosas de red, utils relacionados con la red
  • Com.myname.myproject.data – ayudantes db, proveedores, etc
  • Com.myname.myproject.model – modelo de objeto

Etc.

En cuanto a la comunicación dentro de su aplicación …

Siempre tengo una clase de aplicación personalizada que me registro en el manifiesto. De esta manera, cuando tengo controladores y ayudantes que necesitan ser una "instancia única", no tengo que hacer todo ese material de singleton seguro de hilo loco … solo conservo una copia global de.

RoboGuice es un marco de inyección de dependencia que hace que esto sea aún más fácil de lograr … definitivamente vale la pena mirar. Si esto te interesa, el Grupo de Google para RoboGuice es grande y está constantemente lleno de los creadores del marco que básicamente puede responder a cualquier cosa que necesite.

En cuanto a la comunicación en la aplicación, uso mi controlador de instancia única y las clases de estado para mantener el estado y hacer tareas comunes, y por lo general utilizan BroadcastIntents para comunicar de nuevo a las actividades de los servicios

  • Android: Relativelayout en Framelayout no aparece (Pantalla de vista previa de cámara personalizada)
  • ¿Es una buena idea que un Fragmento delegue todo el control de navegación en Actividad?
  • ActionBar Tabs con fragmentos en rotación
  • Inserción de una vista de texto en medio de una vista de imagen de Android
  • Sombra larga de Android TextView
  • Desplazar una vista / disposición oculta desde abajo
  • Android animateLayoutChanges y flicker anclado fab
  • Animación de botón de acción flotante de Android
  • ¿Cómo hacer que un diseño sea desplazable? Androide
  • Cómo evitar que otra vista sea expulsada de la pantalla
  • Diseño de subclases de Android ViewGroup personalizadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.