¿Es seguro regresar de getApplication () anulado a una estática compartida?

Estoy tratando de limitar una familia de aplicaciones, usando la misma actividad (en un Proyecto de biblioteca compartido por todos), para que solo uno dicha aplicación puede ejecutarse a la vez.

En mi primera ronda de tratar de aprender cómo hacerlo, aprendí que:

  1. android:launchMode="singleTask" no funcionará.
  2. setVisible(true/false) en onResume()/onPause() respectivamente es el mejor manera para decir si my la aplicación se está ejecutando. Pero, ¿qué hago con él una vez que la segunda instancia sabe que la primera instancia se está ejecutando?

Entonces, estoy pensando en engañar al sistema devolviendo siempre la misma instancia anulando Activity.getApplication () y devolviendo una estática compartida:

public class MyApplication extends Application 
{   
    private static MyApplication s_instance;

    public MyApplication()
    {
        s_instance = this;
    }

    public static MyApplication getApplication()
    {
        return s_instance;
    }
}

(el crédito por la idea es para @inazaruk)

Pero, al igual que la solución de visibilidad antes mencionada, ¿qué hago ahora con esto?

¿Utiliza el propio sistema getApplication () para determinar si lanzar una nueva instancia o simplemente llevarla al frente de la pila? ¿Es esto seguro?

Si la respuesta es "no", ¿puedo simplemente llamar Activity.finish () para no dejar que la segunda actividad ni siquiera comience? Si es así, ¿dónde hago esto?

  1. Justo en Activity.onCreate ()?
  2. Activity.onResume ()?
  3. Mi aplicación()? (constructor)
  4. ¿Un mejor lugar?

preguntado el 31 de julio de 12 a las 12:07

Estoy un poco confundido. Tu dices una familia de aplicaciones pero como se envasan? En Android, un APK contiene una sola aplicación. La aplicación tiene un nombre de paquete único y un ID de usuario único y se ejecuta en su propio proceso. Esto significa que si tiene 2 aplicaciones en 2 paquetes separados, se ejecutarán en 2 procesos separados y, por lo tanto, devolverán instancias estáticas de getApplication() no te hará ningún bien en absoluto. Por favor, elabore y explique más acerca de cómo estas aplicaciones se relacionan entre sí. -

@DavidWasser Tienes toda la razón. Se ejecutan en 2 procesos separados y, por lo tanto, devolver instancias estáticas de getApplication() no me sirve de nada. También tiene razón acerca de que los nombres de los paquetes de la aplicación son diferentes, pero eso no es relevante aquí porque el nombre del paquete del Proyecto de biblioteca compartido es idéntico. Cualquier idea de cómo rastrear eso, a través de diferentes procesos, en en tiempo real (es decir, no a través de las preferencias compartidas lentas, sino en una memoria RAM más rápida)? Si publica su comentario como respuesta, lo aceptaré. -

1 Respuestas

Estoy un poco confundido. Usted dice una familia de aplicaciones, pero ¿cómo se empaquetan? En Android, un APK contiene una sola aplicación. La aplicación tiene un nombre de paquete único y un ID de usuario único y se ejecuta en su propio proceso. Esto significa que si tiene 2 aplicaciones en 2 paquetes separados, se ejecutarán en 2 procesos separados y, por lo tanto, devolver instancias estáticas de getApplication() no le servirá de nada.

Aquí hay una idea que podría funcionar para usted:

Cada aplicación que usa esta biblioteca compartida podría transmitir un Intent persistente que contiene el nombre del paquete de la aplicación que se ejecuta como un Extra.

Cada aplicación que usa la biblioteca compartida podría registrar un oyente para este Sticky Intent y, si obtiene uno, puede buscar y ver si esa aplicación (la que está en el Extra) se está ejecutando actualmente. Si esa aplicación se está ejecutando, podría negarse a ejecutarse (o advertir al usuario y preguntarle si debe ejecutarse, o lo que sea).

Es solo un pensamiento, y en realidad no lo he probado, pero creo que esto podría hacerse para hacer lo que quieras.

Respondido 01 ago 12, 23:08

Maravillosa idea. ¡Gracias! Sería interesante comparar cuánto más rápido es que una implementación de preferencia compartida. - ateiob

Después de aprender un poco más sobre esto, incluso una transmisión pegajosa no es tan buena: stackoverflow.com/a/5457559/869501 . Volver al punto de partida. Quizás el getRunningAppProcesses () es el compromiso preferido, aunque "este método solo está diseñado para depurar o crear una interfaz de usuario de administración de procesos orientada al usuario." Dado que estas son todas mis propias aplicaciones, supongamos que estoy creando "una interfaz de usuario de gestión de procesos orientada al usuario". ;) - ateiob

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.