【问题标题】:How can i redirect my app to a lock screen when reenter app重新进入应用程序时如何将我的应用程序重定向到锁定屏幕
【发布时间】:2019-09-02 12:55:59
【问题描述】:

我的应用程序可以用密码或指纹锁定。我能够通过“启动”活动在 App Start 上执行此操作来处理 pin/fingerprint 内容。但是一旦处理它就会解锁。但我希望当应用程序处于后台时,在应用程序恢复时显示锁定屏幕。我该如何管理?

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

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

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

}

然后它进入了一个无限循环...... :(。我无法区分我是来自我的应用程序中的另一个活动还是应用程序回到前台。

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

谢谢, 塞比

【问题讨论】:

  • 我猜就用这样的东西stackoverflow.com/questions/3446202/…
  • 我不是想知道手机何时解锁/锁定,而是我的应用程序何时进入前台,然后重定向到我的启动活动。但是没有无限循环。但感谢您的链接。

标签: android android-activity lockscreen resume


【解决方案1】:

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

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中隐藏开启活动的实现:

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

【讨论】:

  • 是的,我正在做类似的事情来避免循环,但问题是,我无法区分应用程序是否在后台或 onStart()/onResume() 是从内部活动。
【解决方案2】:

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

有了这个,我可以检查应用程序是来自后台还是来自内部活动。 然后我可以将 Intent 调用到我的启动活动中。

【讨论】:

    【解决方案3】:

    这取决于您是如何完成销锁定的。

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

    但我建议您研究一下这些方法 - 它们是 Android 操作系统的默认设置。

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

    从 API 28 开始,您可以使用 BiometricPrompt。您可以使用它的Builder 的方法setDeviceCredentialAllowed(true),它会以与KeyguardManager 类似的方式处理pin 的东西,只有面部/指纹选项。 BiometricPromptauthenticate 方法,它实际上会提示 pin 屏幕。它接收侦听器作为参数,因此您不需要onActivityResult

    【讨论】:

    • 这是一个有趣的观点,我将研究 KeyguardMangager。你说得对,我使用自己的 Activity 来显示和处理 PIN/指纹信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多