Mantenerlo modular en android – Dividir los recursos de una buena manera

Fondo

Estoy tratando de mantener una aplicación que es lo más modular posible.
La aplicación tendrá tareas que realiza en intervalos diferentes. Mi objetivo es hacer que sea tan fácil añadir nuevas tareas con una comprensión mínima de la arquitectura subyacente y sin tener que modificar otros archivos, pero al mismo tiempo no más de complicar el código.

Sería perfecto si todo lo que necesitaba hacer para agregar una nueva tarea es crear el archivo y eso es todo.
Esto requerirá cargar las tareas en tiempo de ejecución que realmente no me gusta, podría vivir con un solo lugar donde se realiza todo el registro (esto también habilitó la conmutación de la tarea)

En este momento tengo una clase de tarea abstracta que tiene una pieza de código estático que registra todas las tareas (básicamente las agrega a una lista).

Problema

Cada tarea tendrá su propio conjunto de preferencias y posiblemente recursos.
La división de cadenas y matriz es bastante fácil mediante el uso de prefijos para los nombres, pero el principal problema viene con las preferencias.

Ahora mismo estoy usando una PreferenceActivity para mostrar mis preferencias.
La configuración general se carga desde un archivo XML. Las preferencias de cada tarea se encuentran en una PreferenceScreen separada. Todas las tareas tienen sólo una cosa común y que es una "habilitada" casilla de verificación.

No quiero almacenar todas las preferencias en un archivo, ya que tiene la posibilidad de obtener muy complicado de esa manera.

Solución actual

En este momento cada tarea tiene un método setupPreferences(PreferenceScreen) en el que pueden agregar las opciones que deseen. Sin embargo, esto tiene la desventaja de ser programáticamente que no es tan malo, pero me gustaría evitar que si es posible.

Solución deseada

La solución óptima sería si cada tarea pudiera tener su propio archivo XML que se carga y se agrega a la raíz de PreferenceScreen , por lo que sé que esto no es posible, la única manera de cargarlo es en una PreferenceActivity .

Otras notas

Si alguien tiene alguna otra sugerencia sobre la división de recursos en android no dude en compartirlos 🙂

Gracias
Nicklas


Aclaración

Las tareas que estoy hablando nunca son de terceros, sólo internas. Esto es más de una manera de obtener una buena estructura de esta aplicación.

    Mediante el uso de la reflexión estoy llamando a PreferenceManager.inflateFromResource(Context, int, PreferenceScreen) para crear una PreferenceScreen de mis archivos XML.

    Los recursos de cadena se separan en archivos separados y se prefijan con taskname_

    Aquí está el código para inflar el PreferenceScreen , debe ser colocado en un PreferenceActivity :

     /** * Inflates a {@link android.preference.PreferenceScreen PreferenceScreen} from the specified * resource.<br> * <br> * The resource should come from {@code R.xml} * * @param resId The ID of the XML file * @return The preference screen or null on failure. */ private PreferenceScreen inflatePreferenceScreenFromResource(int resId) { try { Class<PreferenceManager> cls = PreferenceManager.class; Method method = cls.getDeclaredMethod("inflateFromResource", Context.class, int.class, PreferenceScreen.class); return (PreferenceScreen) method.invoke(getPreferenceManager(), this, resId, null); } catch(Exception e) { Log.w(LOG_TAG, "Could not inflate preference screen from XML", e); } return null; } 

    He aquí un ejemplo de cómo usarlo:

     package com.example; import java.lang.reflect.Method; import com.example.R; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; import android.util.Log; public class ExamplePreferenceActivity extends PreferenceActivity { public static final String PREFERENCE_NAME = "ExamplePreferences"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Sets the preference name PreferenceManager pm = getPreferenceManager(); pm.setSharedPreferencesName(PREFERENCE_NAME); // Adds default values and the root preference screen PreferenceManager.setDefaultValues(this, PREFERENCE_NAME, MODE_PRIVATE, R.xml.preferences_layout, false); addPreferencesFromResource(R.xml.preferences_layout); PreferenceScreen root = getPreferenceScreen(); // Includes R.xml.other_preferences_layout and adds it to the bottom of the root preference screen PreferenceScreen otherPreferenceScreen = inflatePreferenceScreenFromResource(R.xml.other_preferences_layout); root.addPreference(otherPreferenceScreen); PreferenceManager.setDefaultValues(this, PREFERENCE_NAME, MODE_PRIVATE, R.xml.other_preferences_layout, false); } /** * Inflates a {@link android.preference.PreferenceScreen PreferenceScreen} from the specified * resource.<br> * <br> * The resource should come from {@code R.xml} * * @param resId The ID of the XML file * @return The preference screen or null on failure. */ private PreferenceScreen inflatePreferenceScreenFromResource(int resId) { try { Class<PreferenceManager> cls = PreferenceManager.class; Method method = cls.getDeclaredMethod("inflateFromResource", Context.class, int.class, PreferenceScreen.class); return (PreferenceScreen) method.invoke(getPreferenceManager(), this, resId, null); } catch(Exception e) { Log.w(LOG_TAG, "Could not inflate preference screen from XML", e); } return null; } } 

    Este ejemplo usaría res/xml/preferences_layout.xml como raíz y luego agregaría res/xml/other_preferences_layout.xml al fondo de la raíz.

    No es exactamente una respuesta a tu pregunta, pero puede ser interesante de todos modos: echa un vistazo a la API del complemento para Locale y Tasker: http://www.twofortyfouram.com/developer.html

    Locale y Tasker son aplicaciones de automatización de teléfonos. Ambos son altamente configurables y modulares, aceptan complementos de terceros para ampliar su funcionalidad. Al igual que en su caso, cada plugin tiene preferencias únicas. Su solución al problema es que cada plugin aporta su propia actividad de preferencias, accesible mediante una acción de intención específica. Hay pautas de la interfaz de usuario para que las pantallas de preferencias sean coherentes.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.