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?
- ¿Cómo usar mkdirs de manera segura en Java?
- Cómo elegir el tamaño de la agrupación de hilos en android
- ¿Cómo obtener detalles de la aplicación de terceros en android?
- Obtener mapa de bits de ImageView en Android L
- Problema en la lectura de la palabra francesa desde el archivo de texto en java / android
- Tipo Advertencia de seguridad con Iterator JSON
- HTTP / 1.1 400 Petición incorrecta en httpGet con autenticación base
- No se puede resolver el símbolo R
- ClassNotFoundException: twitter4j.conf.PropertyConfigurationFactory: Android
- Conecte con los clientes de iOS y Android a SockJS Backend
- Eclipse, Eliminar / corregir fácilmente @Override debido al cambio de versión de Java
- Cómo llamar a un método de una clase mantenida bajo otro paquete
- Uso del selector de dispositivos Android Bluetooth
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
-
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.
-
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.