Implementar bloqueo de contraseña para la aplicación de Android

Mi aplicación tiene información de usuario sensible y tenemos que implementar una pantalla de código de acceso que se mostrará cada vez que el usuario abra la aplicación. Aquí están los dos acercamientos que intenté después de leer este poste .

  1. Utilizar una variable estática y restablecerla en onStop() de cada actividad y comprobarla nuevamente en el onStart() de cada actividad y mostrar la pantalla de código de acceso si el tiempo transcurría un mínimo de umbral decir 1-2 segundos. El problema con este enfoque es que mi aplicación también utiliza intentos para llamar a cámaras y escáneres de código de barras y los usuarios pueden pasar períodos más largos en estas aplicaciones externas. Puedo aumentar el umbral en este caso, pero hace que los cálculos complicados y no es una muy buena solución.

  2. Intenté el otro acercamiento usando este método.

     protected boolean isAppOnForeground(final Context context) { List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses(); if (appProcesses == null) { return false; } final String packageName = context.getPackageName(); for (RunningAppProcessInfo appProcess : appProcesses) { if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && appProcess.processName.equals(packageName)) { return true; } } return false; } 

Pero esto siempre volverá verdadero cuando lo compruebo en el método onStart de cada actividad ya que el proceso ya se inició cuando está en onStart

¿Hay algún otro enfoque que pueda tomar para mostrar un código de acceso cuando el usuario abra la aplicación? Debe mostrarse incluso cuando el usuario haga clic en la pantalla de inicio para salir de la aplicación y, a continuación, volver a la aplicación de las aplicaciones recientes.

He implementado esta característica exacta. I esencialmente hizo su # 1, pero en un poco más limpio.

Lo que hice fue escribir una subclase abstracta de Activity , y anular onResume() . Allí, decida si necesita mostrar la pantalla de bloqueo de contactos. Si lo hace, termine usted mismo e inicie la actividad de pin lock. Haga que todas sus actividades amplíen esta actividad.

Para recordar dónde estaba, puede agregar una "intención inicial" adicional a la intención utilizada para iniciar la actividad de bloqueo de clavijas. Cuando se desbloquea la aplicación, la actividad de bloqueo de clavijas puede utilizar ese extra para volver a colocar al usuario en el lugar donde estaban.

Si su aplicación estaba basada en fragmentos, esto sería simple. Cada vez que se reanuda la actividad que aloja todos los fragmentos, se muestra el fragmento de bloqueo de pin. eso es todo.

El problema con una aplicación que consiste en un montón de actividades es que no hay un momento definitorio claro de "iniciar" la aplicación. El concepto no existe. Esto es esencialmente el problema que encontró con su solución # 1. onResume() parece una buena opción, pero que puede ser llamado por muchas razones. Por ejemplo, el usuario inicia la actividad A, que comienza la actividad B. Ahora presionan hacia atrás. Mostrar el bloqueo de alfiler, o no?

Cualquier solución que utilice un hilo que compruebe procesos en primer plano es una idea terrible debido al impacto de la batería.

Finalmente, es posible que desee cuestionar el requisito de tener un pin bloqueo cada vez que la aplicación se lleva a primer plano. Parece excesivo si salgo a leer un mensaje de texto y vuelvo 10s más tarde me veo obligado a volver a entrar en un pin. Basado en el tiempo parece más apropiado.

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