Una manera más rápida o más limpia de averiguar si un paquete está instalado en Android

Sé que puedo capturar el NameNotFoundException de una llamada a PackageManager.getPackageInfo o hacer un bucle a través de la lista PackageInfo devuelta por PackageManager.getInstalledPackages para saber si un paquete en particular está instalado, pero ambos parecen largos o sinuosos. En mi teléfono personal, tengo más de 300 paquetes instalados, así que odiaría tener que hacer esa operación cada vez que necesite comprobar. Y la captura de una excepción como un medio de realizar la lógica de la aplicación sólo me hace sentir mal todo. ¿Estoy perdiendo el método isPackageInstalled en alguna parte, o solo necesito implementarlo usando una de las técnicas mencionadas anteriormente? Y si este último, que sería considerado el más rápido y menos recurso intensivo opción?

4 Solutions collect form web for “Una manera más rápida o más limpia de averiguar si un paquete está instalado en Android”

Dado que PackageManager.getInstalledPackages() devuelve una List , no es necesario realizar un bucle manualmente. Puede utilizar List.contains() o List.containsAll() para realizar la tarea en una línea de código. Por supuesto, esto no cambia la eficiencia ya que ambos métodos probablemente contienen un bucle ellos mismos.

Si el uso de la API realmente los errores, entonces usted puede mirar en un hack que implica lo siguiente

Bash expresión de shell que obtiene la lista PM Java Runtime expresión Java Pipes y buffers y secuencias Java NIO Java grep

Así que la expresión bash sería:

Pm lista de paquetes -f | Sed 's / ^ package .//' | Awk -F "=" '{print $ 2 "" $ 1}' | ordenar

Y de la lista de referencias para manejar stdout de la 'lista pm' de una manera que podría terminar siendo más rápido …

PipedBuffers

NIO / grep

Tiempo de ejecución / secuencias

Manejar un NameNotFoundExcepetion no debe hacer que te sientas "equivocado en todo" IMHO. De acuerdo con la documentación, esta excepción se lanzará si el paquete no existe desde el nivel de api 1. Usar la sentencia try / catch es muy similar a usar una sentencia if / then para probar un valor nulo.

En este caso, no se debe considerar una solución o un hack como se está utilizando el valor devuelto documentado y esperado de una excepción para determinar si existe un paquete.

Supongo que este método es más rápido que iterar a través de la lista devuelta por getInstalledPackages (). Sin embargo, no sé qué pasos toma androide antes de devolver un NameNotFoundExcepetion. Esto haría una prueba de referencia interesante.

No tengo conocimiento de ningún otro método práctico para probar un paquete instalado.

Escribí algunos puntos de referencia y probé la captura de la excepción vs algunas maneras diferentes de buscar los paquetes instalados y realizar bucle a través de ellos. Aquí está mi resultado

  1. Llamar a PackageManager.getPackageInfo y capturar el NameNotFoundException tomó entre 1 y 4 ms en todos los casos si el paquete solicitado estaba instalado o no, y me aseguré de incluir también los casos en que esta fue la primera llamada a PackageManager para una ejecución particular de la aplicación Y como una llamada posterior sólo en caso de que el marco de cualquier almacenamiento en caché de esta información por lanzamiento de la aplicación.

  2. Llamar a PackageManger.getPackageInfo tomó entre 1 y 1,5 segundos en todos los casos también.

Llamar a getPackageInfo y capturar la excepción para determinar si el paquete no está instalado es, con mucho, la forma más rápida de comprobar.

  • ¿Cómo hago que mi ImageView tenga un tamaño fijo independientemente del tamaño del mapa de bits
  • Calcular la diferencia entre dos veces en Android
  • ¿Mi módulo Xposed tiene su propio contexto?
  • Android java.lang.IllegalMonitorStateException: objeto no bloqueado por hilo antes de esperar ()
  • Organización de paquetes de Android
  • La captura de pulsaciones de teclas cuando el teléfono Android está en modo de suspensión profunda
  • Por qué la aplicación lanza un NoSuchMethodError
  • Cómo reemplazar el valor en clave particular en LinkedHashMap
  • CountDownTimer.cancel () no funciona en Android
  • Android Support Annotation "debería tener @Retention (RetentionPolicy.SOURCE)"
  • Android: layout_gravity no funciona como se esperaba
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.