重新进入应用程序时如何将我的应用程序重定向到锁定屏幕

How can i redirect my app to a lock screen when reenter app

我的应用程序可以用 pin 或指纹锁定。我能够在 App Start 上用 "Start Up" Activity 处理 pin/fingerprint 东西来做到这一点。但是一旦处理它,它就会解锁。但我希望当应用程序处于后台时,当应用程序恢复时会显示锁定屏幕。我该如何管理?

当调用 MainActivity 的 OnResume() 时,我试图启动一个 Intent。

@Override
protected void onResume() {
    super.onResume();

    Intent settingsIntent = new Intent(this, StartUpActivity.class);
    startActivity(settingsIntent);

}

但随后进入无限循环... :(。通过简历,我无法区分我是来自我的应用程序中的另一个 activity,还是该应用程序正在返回前台。

我也搜索了一下,但没有找到解决这个问题的方法。如果我错过了解决方案,请提供 link.

谢谢, 塞比

onResume 是一个合适的起点。但是您还需要添加一些东西来处理 lock/unlock 逻辑并定义不可锁定的屏幕以避免循环。

Lock/unlock 逻辑可以放在类似 PinManager

的地方
interface PinManager {

  /**
   * it's up to you how to define logic inside.
   * It could be locked after some time 
   * or locked when app is destroyed and removed from memory
   */
  fun isLocked():Boolean

  fun unlock(pin:List<Integer>)

  fun clear()
}

为避免循环,您可以定义接口:

interface NonLockedActivity {

}

并将其与验证 pin 的活动一起使用:

class VerifiyPinActivity: BaseActivity(), NonLockedActivity {
  fun verifiy(pin:List<Int>){

    if(pinManager.unlock(pin)){
      finish()//and show previous activity
    } else {
      //show invalid pin message
    } 
  }
}

在基础活动中 onResume 可能看起来像这样

class BaseActivity: Activity(){
  fun onResume(){

    if(pinManager.isLocked()){
      navigator.verifyPin(this)
    }

  }
}

并在 navigator 中隐藏打开 activity 的实现:

class Navigator {
  fun verifyPin(acitvity:Activity) {
    if(activity is not NonLockedActivity) {
      startActivity(VerifiyPinActivity::class)
    }
  }
}

我能够执行此答案中描述的检查:How to detect when an Android app goes to the background and come back to the foreground

有了这个,我可以检查应用程序是来自后台还是来自内部 activity。 然后我可以将 Intent 调用到我的 Start Up Activity。

这取决于您如何完成密码锁定。

根据这个问题,我假设您为此使用了一些库或自制方法。在这种情况下,您可以在 SharedPreferences 中存储一些值 isLocked 并在每次 onDestroyonStop 中将其更改为 true。当用户进入您的应用程序时,您应该检查是否 isLocked == true 并提示固定屏幕并在成功解锁时将其更改为 false,如果 isLocked == false 您可以继续您的应用程序流程。如果您希望这样做更简单 - 您可能只有一些静态变量并操纵它的值 - 但在应用程序进程重新创建时它将更改为默认值。

但我建议您研究一下这些方法 - 它们是 Android OS.

的默认方法

对于 KeyguardManager,您应该将 Intent intent = keyguardManager.createConfirmDeviceCredentialIntent(title, description)startActivityForResult(intent) 结合使用,这将处理您需要的所有内容,而在 onActivityResult 中,您可以继续前进。

从API 28开始可以使用BiometricPrompt。您可以使用其 Builder 的方法 setDeviceCredentialAllowed(true) 以与 KeyguardManager 类似的方式处理 pin 内容,仅使用 face/fingerprint 选项。 BiometricPrompt 有方法 authenticate 会实际提示 pin 屏幕。它接收侦听器作为参数,因此您不需要 onActivityResult