{"id":5975,"date":"2024-11-20T06:55:36","date_gmt":"2024-11-20T05:55:36","guid":{"rendered":"https:\/\/www.aiknow.io\/guia-de-patrones-de-arquitectura-en-android\/"},"modified":"2024-11-20T06:55:36","modified_gmt":"2024-11-20T05:55:36","slug":"guia-de-patrones-de-arquitectura-en-android","status":"publish","type":"post","link":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/","title":{"rendered":"GU\u00cdA DE PATRONES DE ARQUITECTURA EN ANDROID"},"content":{"rendered":"<h1>PATRONES DE ARQUITECTURA EN ANDROID: Introducci\u00f3n<\/h1>\n<p>La programaci\u00f3n para Android es un campo de trabajo muy amplio que requiere muchos conocimientos. Una aplicaci\u00f3n Android no es s\u00f3lo una pantalla de interacci\u00f3n con el usuario (front-end), sino tambi\u00e9n una aplicaci\u00f3n back-end, que puede incluir tambi\u00e9n la gesti\u00f3n de bases de datos, prestando al mismo tiempo mucha atenci\u00f3n al rendimiento y la capacidad de respuesta, y por tanto al trabajo distribuido en los diferentes hilos (necesariamente). Lo que en una aplicaci\u00f3n web de microservicios encontramos dividido en diferentes aplicaciones, quiz\u00e1s incluso ejecut\u00e1ndose en diferentes servidores, en Android lo encontramos todo en una \u00fanica aplicaci\u00f3n, ejecut\u00e1ndose en la palma de la mano. No es un mundo, sino un cosmos: un microcosmos que contiene galaxias de conceptos que hay que conocer y con los que hay que familiarizarse, y en el que tambi\u00e9n es f\u00e1cil perderse. Pero no temas: en AIknow podemos darte algunos consejos para que tu nave espacial mantenga el rumbo, conquistando el universo Android, empezando por el primer planeta: los patrones arquitect\u00f3nicos en Android, ergo, c\u00f3mo configurar la arquitectura de tu aplicaci\u00f3n de forma ordenada y eficiente.    <\/p>\n<h3>CONCEPTOS B\u00c1SICOS<\/h3>\n<p>Para aquellos que a\u00fan no est\u00e1n familiarizados con Android, presentamos una r\u00e1pida visi\u00f3n general de los elementos b\u00e1sicos. El punto de partida de todo proyecto Android es la <strong>Activity<\/strong>. Por Actividad entendemos una funcionalidad de la aplicaci\u00f3n, consistente en<\/p>\n<ul>\n<li>una parte gr\u00e1fica para interactuar con el usuario. Consiste en un archivo XML que tambi\u00e9n puede \u00abdise\u00f1arse\u00bb visualmente en una secci\u00f3n especial de Android Studio. <\/li>\n<li>una parte l\u00f3gica, es decir, las operaciones que se realizar\u00e1n al inicio y\/o en respuesta a las acciones del usuario. Consiste en una clase Java o Kotlin que extiende la clase Android AppCompatActivity. <\/li>\n<\/ul>\n<p>Cada aplicaci\u00f3n Android contiene al menos una Actividad. Si la aplicaci\u00f3n contiene varias actividades, una de ellas se etiqueta como Actividad principal y se ejecuta primero cada vez que se inicia, y desde ella se puede navegar (mediante botones o de otra forma) a las otras Actividades.<br \/>\nCada Actividad puede subdividirse en varios sub-elementos, o fracciones de la misma funcionalidad, llamados <strong>Fragment<\/strong>. Exactamente igual que la Actividad, el Fragmento tambi\u00e9n se compone de un XML y una clase Java o Kotlin. Cada Actividad o Fragmento posee un ciclo de vida, es decir, una serie de m\u00e9todos que se ejecutan como consecuencia de eventos del sistema operativo. Por citar algunos:  <\/p>\n<ul>\n<li>onStart(): la actividad (o fragmento) se ha iniciado<\/li>\n<li>onResume(): la actividad (o fragmento) se ha \u00abreanudado\u00bb tras un estado de pausa<\/li>\n<li>onPause(): la actividad (o fragmento) se ha puesto en pausa (por ejemplo, porque ha entrado una llamada de tel\u00e9fono o se ha bloqueado la pantalla).<\/li>\n<li>onDestroy(): la actividad (o fragmento) se ha destruido (por ejemplo, porque se ha pasado a una nueva actividad o se ha cerrado la aplicaci\u00f3n).<\/li>\n<\/ul>\n<p>Para aquellos que intentan escribir su primera aplicaci\u00f3n Android con Android Studio, despu\u00e9s de haberse familiarizado con los conceptos de Actividad, Fragmento y ciclo de vida, puede resultar natural a\u00f1adir a la Actividad todo el c\u00f3digo Java (o Kotlin) necesario para recuperar datos de la base de datos, mostrarlos en pantalla, gestionar eventos, notificaciones, llamar a APIs&#8230; Esto es comprensible, pero el riesgo de este enfoque es que las Actividades y Fragmentos alcancen dimensiones astron\u00f3micas, y contengan muchas tareas diferentes, por no hablar de la dificultad de mantener el orden en medio de todo este marem\u00e1gnum de c\u00f3digo. Para remediar este problema, o al menos reducir estos riesgos, los patrones arquitect\u00f3nicos vienen en nuestra ayuda. <\/p>\n<h3><\/h3>\n<h3>PATRONES ARQUITECTURALES: QU\u00c9 Y POR QU\u00c9<\/h3>\n<p>Los patrones de dise\u00f1o arquitect\u00f3nico (de <a href=\"https:\/\/it.wikipedia.org\/wiki\/Design_pattern#Pattern_architetturali\" target=\"_blank\" rel=\"noopener\">Wikipedia<\/a>) expresan patrones b\u00e1sicos para establecer la organizaci\u00f3n estructural de un sistema de software. Un patr\u00f3n arquitect\u00f3nico es, por tanto, un conjunto de trucos a seguir para mantener bien separadas las capas que componen nuestra app. No es necesario para el correcto funcionamiento de la app, sin embargo es una herramienta fundamental para:<\/p>\n<ul>\n<li>mantener el orden en grandes aplicaciones: una aplicaci\u00f3n limpia y ordenada es mucho m\u00e1s f\u00e1cil de mantener y evolucionar, y por tanto menos costosa<\/li>\n<li>establecer la arquitectura de una aplicaci\u00f3n peque\u00f1a que podr\u00eda ampliarse en el futuro: el uso de un patr\u00f3n arquitect\u00f3nico permite ampliarla con agilidad, sin tener que emprender una costosa refactorizaci\u00f3n total.<\/li>\n<li>probar f\u00e1cilmente partes individuales de la l\u00f3gica de business o de la interfaz de usuario<\/li>\n<\/ul>\n<p>En los siguientes p\u00e1rrafos describiremos, con ejemplos pr\u00e1cticos, uno de los patrones arquitect\u00f3nicos m\u00e1s populares en Android, el patr\u00f3n MVP.<\/p>\n<h3>MVP (Model &#8211; View &#8211; Presenter)<\/h3>\n<p>Hijo del conocido MVC (Model &#8211; View &#8211; Controller), uno de los patrones arquitect\u00f3nicos m\u00e1s conocidos en programaci\u00f3n orientada a objetos, MVP es un patr\u00f3n muy similar utilizado en programaci\u00f3n Android, en el que el Presentador ocupa el lugar del Controlador.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter wp-image-5956 size-full\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/Aiknow-MVP-model-view-presenter.png\" alt=\"patrones de arquitectura en android\" width=\"474\" height=\"454\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/Aiknow-MVP-model-view-presenter.png 474w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/Aiknow-MVP-model-view-presenter-300x287.png 300w\" sizes=\"(max-width: 474px) 100vw, 474px\" \/><\/p>\n<p>El objetivo de MVP (al igual que MVC) es separar la l\u00f3gica de presentaci\u00f3n de la l\u00f3gica de negocio. MVP y MVC difieren en la forma en que los tres elementos se comunican entre s\u00ed (m\u00e1s sobre esto en un momento). Repasemos los tres componentes:  <\/p>\n<h5>MODEL<\/h5>\n<p>El Modelo es la capa que se encarga de gestionar los datos, es decir, de proporcionarlos o actualizarlos, independientemente de cu\u00e1l sea la fuente (base de datos, preferencias, api). La capa de la aplicaci\u00f3n que solicita los datos (el Presentador) es agn\u00f3stica en cuanto a c\u00f3mo se recuperan los datos: depende del Modelo aplicar la l\u00f3gica necesaria para garantizar que se proporcionan los datos solicitados. Por ejemplo, una aplicaci\u00f3n puede tener una clase StarshipsRepository con un m\u00e9todo getStarships() que devuelva la lista de naves espaciales aplicando la siguiente l\u00f3gica:  <\/p>\n<ul>\n<li>si el dispositivo est\u00e1 conectado a Internet, llama a una API externa para obtener la lista actualizada de naves espaciales<\/li>\n<li>si el dispositivo est\u00e1 desconectado, muestra las naves espaciales guardadas en la base de datos.<\/li>\n<\/ul>\n<p>El Modelo tambi\u00e9n debe consistir en clases que no extiendan las clases Android (Actividad, Fragmento, etc.), y no deben tener referencias directas a ellas. S\u00f3lo las clases Presenter pueden llamar directamente a las clases Model para obtener datos. En esto, el patr\u00f3n MVP difiere del patr\u00f3n MVC, en el que en cambio las clases Modelo pueden interactuar directamente con las clases Vista.  <\/p>\n<pre>@Singleton\npublic class StarshipsRepository {\n\nprivate ConnectivityManager connectivityManager;\nprivate EngineManager engineManager;\n\npublic List getStarships() {\n\nif (isNetworkAvailable()) {\nreturn this.serverApiManager.getStarships();\n} else {\nreturn this.databaseManager.getStarships();\n}\n}\n\npublic void launch() {\n\/\/ to implement: launch a starship\n}\n\n...\n\n}<\/pre>\n<h5>VIEW<\/h5>\n<p>En los patrones arquitect\u00f3nicos de Android, una Vista, en cambio, es la capa que se ocupa de interactuar con el usuario. As\u00ed, la Vista incluye todas las Actividades, Fragmentos y, m\u00e1s en general, todas las clases que representan vistas, es decir, los elementos visuales que muestran datos y recogen las acciones del usuario (toques en la pantalla, gestos, uso de la c\u00e1mara, etc.). Las vistas deben ser \u00abtontas\u00bb, en el sentido de que no deben contener l\u00f3gica de negocio, sino \u00fanicamente gestionar la interacci\u00f3n del usuario y reenviar la entrada a la capa de aplicaci\u00f3n m\u00e1s baja (el Presentador). para garantizar la separaci\u00f3n de tareas (en la medida de lo posible, recuerde que los patrones deben ser una ayuda, no una limitaci\u00f3n). La capa Vista tiene simplemente dos tareas: <\/p>\n<ul>\n<li>Recibir las interacciones del usuario con el dispositivo y reenviarlas al Presentador<\/li>\n<li>M\u00e9todos de visualizaci\u00f3n que reciben datos de entrada para mostrarlos al usuario.<\/li>\n<\/ul>\n<p>Estos m\u00e9todos deben ser utilizados por el Presentador. Por tanto, la Vista tiene un papel especial: no debe la l\u00f3gica de la aplicaci\u00f3n, pero al mismo tiempo, al estar sujeta al ciclo de vida, todo empieza y termina con ella, por lo que toda la aplicaci\u00f3n depende de ella. Puede hacer lo suyo, y las dem\u00e1s capas de la aplicaci\u00f3n s\u00f3lo pueden adaptarse lo mejor que puedan.  <\/p>\n<pre> \npublic class StarshipFragment extends Fragment implements StarshipContract.View {\n\n\/\/ Il Fragment (la View) ha un riferimento con il proprio Presenter\nprivate StarshipContract.Presenter starshipPresenter;\n\nprivate RecyclerView mRecyclerView;\nprotected RecyclerView.LayoutManager mLayoutManager;\n\nprivate FloatingActionButton takeOffButton;\n\npublic StarshipFragment() {\nthis.starshipPresenter = new StarshipPresenter(this);\n}\n\npublic static StarshipFragment newInstance() {\nreturn new StarshipFragment();\n}\n\n@Override\npublic void onCreate(Bundle savedInstanceState) {\nsuper.onCreate(savedInstanceState);\n}\n\n@Override\npublic View onCreateView(LayoutInflater inflater, ViewGroup container,\nBundle savedInstanceState) {\n\nView root = inflater.inflate(R.layout.fragment_starship, container, false);\n\n\/\/ ************************\n\/\/ Launch button\n\/\/ ************************\ntakeOffButton = root.findViewById(R.id.takeOffButton);\n\/\/ Ad ogni click sul pulsante, il Fragment non fa altro che chiamare un metodo del Presenter\ntakeOffButton.setOnClickListener( click -&gt; starshipPresenter.launchStarship());\n\n\/\/ ************************\n\/\/ Starships list\n\/\/ ************************\nmRecyclerView = (RecyclerView) root.findViewById(R.id.starshipOverview);\nmLayoutManager = new LinearLayoutManager(getActivity());\nsetRecyclerViewLayoutManager();\nmRecyclerView.setAdapter(starshipsListAdapter);\n\nreturn root;\n}\n\n@Override\npublic void onResume() {\nsuper.onResume();\n\/\/ Ogni volta che il Fragement si avvia (o si riavvia) si esegue il metodo start() del Presenter\n\/\/ come detto, ogni decisione (comprese le operazioni da fare all\u2019avvio) sono delegate al Presenter\nstarshipPresenter.start();\n}\n\n\/\/ ###########################################################\n\/\/ Override from contract\n\/\/ ###########################################################\n\n@Override\npublic void showStarshipsList(List starshipList) {\nthis.starshipsListAdapter.updateList(starshipList);\n}\n\n@Override\npublic void showErrorMessage(int error) {\nsnackbar.setText(getString(error));\nsnackbar.show();\n}\n\n...\n\n}<\/pre>\n<h5>PRESENTER<\/h5>\n<p>El Presentador es el titular de la l\u00f3gica empresarial. Debemos imaginarlo como el capit\u00e1n de una nave (espacial): asigna tareas a los distintos miembros de la tripulaci\u00f3n y es responsable de tomar decisiones que afectan al destino de la nave. Interact\u00faa tanto con el Modelo como con la Vista:  <\/p>\n<ul>\n<li>La Vista recibe la entrada del usuario y \u00abdecide\u00bb qu\u00e9 hacer con esta entrada, aplicando la l\u00f3gica real de la aplicaci\u00f3n.<\/li>\n<li>A partir del Modelo decide qu\u00e9 datos recuperar, y los pasa a la Vista para que los muestre al usuario.<\/li>\n<\/ul>\n<p>El presentador tambi\u00e9n tiene la importante tarea de orquestar los hilos correctamente. Sin entrar en demasiados detalles, debe evitar que el hilo principal (dedicado a la interfaz de usuario) se emplee en operaciones computacionalmente pesadas, lo que podr\u00eda provocar una ca\u00edda de la capacidad de respuesta (o incluso un bloqueo de la aplicaci\u00f3n, la pesadilla de todo programador de Android). Para ello, asigna al hilo principal s\u00f3lo las operaciones m\u00ednimas imprescindibles para que la interfaz de usuario funcione, mientras que el resto de operaciones (operaciones de lectura\/escritura, llamadas a APIs externas, etc.) las asigna a hilos espec\u00edficos. El Presentador, al no ser una extensi\u00f3n de una clase de Android, y por tanto no tener ciclo de vida, depende de la Vista. Su propia existencia depende de la Vista. Por tanto, el Presentador puede considerarse como una herramienta, a disposici\u00f3n de cada Vista, para quitarle toda la l\u00f3gica de negocio, aligerarla y separar tareas.  <\/p>\n<pre>public class StarshipPresenter implements StarshipContract.Presenter {\n\nprivate StarshipsRepository starshipsRepository;\nprivate EngineManager engineManager;\nprivate final StarshipContract.View mView;\n\npublic Mag5Presenter(StarshipContract.View mView) {\nthis.mView = mView;\n}\n\n\/\/ ###########################################################\n\/\/ Override from contract\n\/\/ ###########################################################\n\n@Override\npublic void start() {\n\nGetMag5TransportItemsList_CB cb = new GetMag5TransportItemsList_CB();\nDisposable d = this.starshipsRepository.getStarships()\n.subscribeOn(Schedulers.io())\n.observeOn(AndroidSchedulers.mainThread())\n.subscribe(\nresult -&gt; mView.showStarshipsList(result),\nerror -&gt; mView.showErrorMessage(R.string.error_fetching_item_mag5)\n);\n\naddDisposable(d);\n\n}\n\n@Override\npublic void launchStarship() {\n\nif (this.engineManager.isEngineReady())\nthis.starshipsRepository.launchStarship();\n\n}\n\n...\n\n}<\/pre>\n<h3>LA INTERFAZ CONTRACT<\/h3>\n<p>El contrato es un elemento del patr\u00f3n MVP que sirve principalmente para mantener el orden en el proyecto y garantizar el cumplimiento de una de las \u00abreglas\u00bb del patr\u00f3n:<\/p>\n<p><em>Cada clase de Vista debe corresponder a una clase de Presentador, con una correspondencia 1:1<\/em><\/p>\n<p>La idea es la siguiente: para cada clase Vista debe haber una y s\u00f3lo una clase Presentador (y viceversa), y se pretende que ambas trabajen juntas, estipulando una especie de contrato: como si se tratara de un equipo en el que el Presentador es la mente, el que decide, la Vista es el brazo, el que ejecuta, pero las dos son complementarias y trabajan en equipo para implementar la misma funcionalidad. Los contratos son interfaces que sirven precisamente para consagrar este v\u00ednculo entre cada Vista y su Presentador. A su vez, contienen dos interfaces, una para la Vista y otra para el Presentador, que a su vez contienen las firmas de los m\u00e9todos correspondientes. De este modo, al examinar una clase Contract, es posible ver de un vistazo lo que se ha implementado en un par Vista\/Presentador, como si fueran una misma cosa.<\/p>\n<pre>public interface StarshipContract {\n\ninterface View {\n\nvoid showErrorMessage(int messageCode);\n\nvoid showStarshipsList(List starshipList);\n\n}\n\ninterface Presenter {\n\nvoid start();\n\nvoid launch();\n\n}\n}<\/pre>\n<h3>CONCLUSI\u00d3N<\/h3>\n<p>Los patrones arquitect\u00f3nicos en android son una herramienta fundamental para hacer tu aplicaci\u00f3n android ordenada, mantenible y escalable. En este art\u00edculo exploramos el patr\u00f3n arquitect\u00f3nico MVP (Model View Presenter) con algunos ejemplos. \u00a1Y no te olvides de echar un vistazo a nuestras otras noticias del <a href=\"https:\/\/www.aiknow.io\/blog\/\">blog<\/a> o nuestros <a href=\"https:\/\/www.aiknow.io\/use-cases\/\">casos de uso <\/a>para ver qu\u00e9 tipo de trabajo hemos hecho en AIknow!<\/p>\n<h5><\/h5>\n<h3 style=\"text-align: center;\">\u00bfNecesita una aplicaci\u00f3n para digitalizar un proceso? \u00bfQuiere saber m\u00e1s? <\/h3>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>PATRONES DE ARQUITECTURA EN ANDROID: Introducci\u00f3n La programaci\u00f3n para Android es un campo de trabajo muy amplio que requiere muchos conocimientos. Una aplicaci\u00f3n Android no es s\u00f3lo una pantalla de interacci\u00f3n con el usuario (front-end), sino tambi\u00e9n una aplicaci\u00f3n back-end, que puede incluir tambi\u00e9n la gesti\u00f3n de bases de datos, prestando al mismo tiempo mucha [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5966,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[128],"tags":[145,147,146,148,149],"class_list":["post-5975","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-novedades-tecnologicas","tag-android-es","tag-app-es","tag-digitalizacion","tag-mvp-es","tag-patron"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Patrones de arquitectura en Android, la gu\u00eda de AIkonw.io<\/title>\n<meta name=\"description\" content=\"Una aplicaci\u00f3n Android no es un mundo, \u00a1sino un microcosmo! En este art\u00edculo hablamos de patrones arquitect\u00f3nicos en Android.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Patrones de arquitectura en Android, la gu\u00eda de AIkonw.io\" \/>\n<meta property=\"og:description\" content=\"Una aplicaci\u00f3n Android no es un mundo, \u00a1sino un microcosmo! En este art\u00edculo hablamos de patrones arquitect\u00f3nicos en Android.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\" \/>\n<meta property=\"og:site_name\" content=\"AIknow\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-20T05:55:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"640\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Angelo Lazzari\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Angelo Lazzari\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\"},\"author\":{\"name\":\"Angelo Lazzari\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330\"},\"headline\":\"GU\u00cdA DE PATRONES DE ARQUITECTURA EN ANDROID\",\"datePublished\":\"2024-11-20T05:55:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\"},\"wordCount\":1888,\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg\",\"keywords\":[\"android\",\"app\",\"digitalizaci\u00f3n\",\"MVP\",\"patr\u00f3n\"],\"articleSection\":[\"Novedades tecnol\u00f3gicas\"],\"inLanguage\":\"es-ES\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\",\"url\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\",\"name\":\"Patrones de arquitectura en Android, la gu\u00eda de AIkonw.io\",\"isPartOf\":{\"@id\":\"https:\/\/www.aiknow.io\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg\",\"datePublished\":\"2024-11-20T05:55:36+00:00\",\"author\":{\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330\"},\"description\":\"Una aplicaci\u00f3n Android no es un mundo, \u00a1sino un microcosmo! En este art\u00edculo hablamos de patrones arquitect\u00f3nicos en Android.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#breadcrumb\"},\"inLanguage\":\"es-ES\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es-ES\",\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage\",\"url\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg\",\"contentUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg\",\"width\":1024,\"height\":640,\"caption\":\"pattern architetturali in android\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.aiknow.io\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GU\u00cdA DE PATRONES DE ARQUITECTURA EN ANDROID\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.aiknow.io\/#website\",\"url\":\"https:\/\/www.aiknow.io\/\",\"name\":\"AIknow - Developing future\",\"description\":\"From Edge To Intelligence\",\"alternateName\":\"AIknow\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.aiknow.io\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es-ES\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330\",\"name\":\"Angelo Lazzari\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es-ES\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g\",\"caption\":\"Angelo Lazzari\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Patrones de arquitectura en Android, la gu\u00eda de AIkonw.io","description":"Una aplicaci\u00f3n Android no es un mundo, \u00a1sino un microcosmo! En este art\u00edculo hablamos de patrones arquitect\u00f3nicos en Android.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/","og_locale":"es_ES","og_type":"article","og_title":"Patrones de arquitectura en Android, la gu\u00eda de AIkonw.io","og_description":"Una aplicaci\u00f3n Android no es un mundo, \u00a1sino un microcosmo! En este art\u00edculo hablamos de patrones arquitect\u00f3nicos en Android.","og_url":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/","og_site_name":"AIknow","article_published_time":"2024-11-20T05:55:36+00:00","og_image":[{"width":1024,"height":640,"url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg","type":"image\/jpeg"}],"author":"Angelo Lazzari","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Angelo Lazzari","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#article","isPartOf":{"@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/"},"author":{"name":"Angelo Lazzari","@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330"},"headline":"GU\u00cdA DE PATRONES DE ARQUITECTURA EN ANDROID","datePublished":"2024-11-20T05:55:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/"},"wordCount":1888,"image":{"@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg","keywords":["android","app","digitalizaci\u00f3n","MVP","patr\u00f3n"],"articleSection":["Novedades tecnol\u00f3gicas"],"inLanguage":"es-ES"},{"@type":"WebPage","@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/","url":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/","name":"Patrones de arquitectura en Android, la gu\u00eda de AIkonw.io","isPartOf":{"@id":"https:\/\/www.aiknow.io\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage"},"image":{"@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg","datePublished":"2024-11-20T05:55:36+00:00","author":{"@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330"},"description":"Una aplicaci\u00f3n Android no es un mundo, \u00a1sino un microcosmo! En este art\u00edculo hablamos de patrones arquitect\u00f3nicos en Android.","breadcrumb":{"@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#breadcrumb"},"inLanguage":"es-ES","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/"]}]},{"@type":"ImageObject","inLanguage":"es-ES","@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#primaryimage","url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg","contentUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/11\/aiknow.io-android-logo.jpg","width":1024,"height":640,"caption":"pattern architetturali in android"},{"@type":"BreadcrumbList","@id":"https:\/\/www.aiknow.io\/es\/guia-de-patrones-de-arquitectura-en-android\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.aiknow.io\/es\/"},{"@type":"ListItem","position":2,"name":"GU\u00cdA DE PATRONES DE ARQUITECTURA EN ANDROID"}]},{"@type":"WebSite","@id":"https:\/\/www.aiknow.io\/#website","url":"https:\/\/www.aiknow.io\/","name":"AIknow - Developing future","description":"From Edge To Intelligence","alternateName":"AIknow","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.aiknow.io\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es-ES"},{"@type":"Person","@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330","name":"Angelo Lazzari","image":{"@type":"ImageObject","inLanguage":"es-ES","@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g","caption":"Angelo Lazzari"}}]}},"_links":{"self":[{"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/posts\/5975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/comments?post=5975"}],"version-history":[{"count":0,"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/posts\/5975\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/media\/5966"}],"wp:attachment":[{"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/media?parent=5975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/categories?post=5975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aiknow.io\/es\/wp-json\/wp\/v2\/tags?post=5975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}