2011-02-22 16 views
5

He estado creando Intents usando putExtra() desde hace bastante tiempo y acabo de leer en la documentación de Android que debería estar prefijando el 'nombre' con el nombre del paquete. Entonces, en lugar de 'putExtra (' ButtonText ',' Ok ')' debería ser más parecido a 'putExtra (' com.mycompany.myapplication.ButtonText ',' Ok ').Creando Intenciones con putExtra

¿Es esto realmente necesario? (parece estar bien sin eso).

Si es necesario, ¿cuál es la ventaja?

Además, ¿el nombre del paquete son los llamantes o el que se llama? Si son las personas que llaman, la 'Actividad llamada' tiene que saber sobre el nombre de las personas que llaman que no sería muy genérico.

Gracias

Respuesta

7

¿Es esto realmente necesario? (parece estar bien sin eso).

No, no es necesario es una aplicación completamente independiente, pero se puede considerar como una buena práctica de todos modos.

Es más importante en las aplicaciones que están a disposición del público para que puedan interactuar, pero mantienen una forma única de identificarse a sí mismas y a los datos que intercambian. En cuanto a qué nombre de paquete se utilizará dependerá del contexto.

Para dar un ejemplo abstracto ...

Company A produce una aplicación que puede proporcionar algún tipo de tratamiento de datos que aplicaciones producido por la compañía B y la Compañía C puede utilizar. La 'acción' para la intención se denominará relevante para la Compañía A, pero los datos que pasen a ella por las dos aplicaciones 'cliente' se denominarán relevantes para las compañías de aplicaciones del cliente. Ejemplo ...

documentos de Appa ...

To request data processing use: 
com.companyA.intent.action.PROCESS_DATA 

Pass data with the above intent as an extra named: 
<your package name>.SOME_DATA 

Ahora, cuando el componente correspondiente de APPA llama con lo anterior, se comprobará que hay un 'extra' con un nombre que termina con .SOME_DATA pero también podrá mantener esos datos por separado de otros datos proporcionados por otras aplicaciones debido al prefijo único. Así que ...

código de la compañía B código

Intent i = new Intent(com.companyA.intent.action.PROCESS_DATA); 
i.putExtra(com.companyB.SomeApp.SOME_DATA, data); 

Compañía C

Intent i = new Intent(com.companyA.intent.action.PROCESS_DATA); 
i.putExtra(com.companyC.SomeOtherApp.SOME_DATA, data); 

bien, posiblemente no es uno de mis mejores ejemplos, pero lo que se pretende es que es importante ver cómo el El entorno de Android tiene que ver con la posibilidad de que los diferentes componentes de la aplicación se puedan utilizar entre sí, pasar datos y que la fuente de esos datos sea identificable de forma única.

+0

gracias, eso lo aclara mucho. Hay un pequeño punto que no entiendo en tu ejemplo. - ¿Se supone que la "com.companyB.SomeApp.SOME_DATA" es de algún tipo en particular (por ejemplo, String)? Asumo que es una cadena y el código de la Compañía A tiene que recortar todo antes e incluir el último 'punto'. De ser así, esto tendría que ser 'entendido' por la Compañía A, B y C (obviamente). – steve

+0

@steve: putExtra usa el formulario (String name, value) donde 'name' debe ser entendido en ambos lados - 'value' puede ser de tipos diferentes (int, string, etc.). Mi ejemplo se basó en cómo las aplicaciones se pueden comunicar directamente en lugar de en una transmisión (como "Tengo un archivo de imagen aquí, ¿quién sabe cómo abrirlo?" Tipo de intención). Pasar datos entre sus propios componentes de la aplicación todavía significa que necesitan saber qué significa 'extra', pero siempre existe el potencial para que los desarrolladores creen aplicaciones que otros desarrolladores pueden usar en base a documentos publicados – Squonk

+0

Gracias @MisterSquonk, lo entiendo. Creo que un buen patrón para este tipo de cosas sería pasar siempre un paquete en los "extras" con un "nombre" totalmente calificado. Entonces, los valores individuales en el paquete podrían tener nombres cortos, ya que quedaría claro quién se basó en el nombre del paquete. Esto sería más fácil de analizar y también leer en el código. Por supuesto, usted podría calificar cada dato, pero eso me parece un poco exagerado ... Gracias de nuevo (y gracias a los otros comentaristas también) – steve

3

Suena más como una cosa "mejores prácticas" que un requisito real. El beneficio que obtienes aquí es si rellenas muchas cosas con intenciones genéricas manejadas por varias actividades que abarcan varias aplicaciones, entonces estás siendo más específico acerca de los datos en tu Intento. Si estás utilizando estos intentos solo internamente en tu aplicación y solo tus propias actividades están manejándolos, estás bien como estás.

1

Creo que esta es una GRAN idea SI está envolviendo sus datos ampliados en una clase serializable, digamos com.mycompany.myapp.MyAppData y enviándolo como:

intent.putExtra("com.mycompany.myapp.MyAppData",myAppData); //==> out 

y recuperar como:

MyAppData myAppData= (com.mycompany.myapp.MyAppData)intent.getSerializableExtra("com.mycompany.myapp.MyAppData",myAppData; // <== in 

JAL