使用 setShowWhenLocked(true) 解锁后如何锁定 Android 设备;

Mr.*_*bot 5 java android react-native

我正在创建一个视频通话应用程序并具有以下代码,当应用程序收到推送通知时调用该代码 - 它解锁屏幕并显示“来电”用户界面:

public class MainActivity extends ReactActivity {

  @Override
  protected String getMainComponentName() {
    return "x";
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
      setShowWhenLocked(true);
      setTurnScreenOn(true);
    }
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
  }
}
Run Code Online (Sandbox Code Playgroud)

这在来电时工作正常 - 用户可以使用呈现的 UI 与应用程序交互。然而,问题是,如果应用程序在前台,然后手机被锁定,当按下手机侧面的解锁按钮时,会显示应用程序,而不是显示键盘锁/锁屏。如果应用程序在前台并且手机已锁定并按下解锁按钮,则它永久允许访问该应用程序。

我希望应用程序在它收到推送通知并且屏幕被锁定时出现,但我也希望用户能够完全锁定设备并且在按下锁定按钮后不让用户访问该应用程序。

我怎样才能做到这一点?

Luk*_*kor 3

据我所知,解决这个问题的最佳方法是进行多种类型的活动。

在第一个活动(调用活动)中,您将 setShowWhenLocked 和 setTurnScreenOn 设置为 true (就像您所做的那样)。
当有电话进来时,您将启动处理呼叫的呼叫活动,因为您设置了这两个属性,即使设备被锁定,该活动也会向用户显示。
此外,当呼叫活动处于活动状态时,用户将能够“锁定”他的设备(即按下电源按钮),并且当他解锁时,他将再次看到呼叫活动(无需输入代码)。
这与大多数默认 Android 呼叫/电话应用程序的行为相同。

第二个活动用于您的其他逻辑,只有当用户真正解锁手机时才应该访问。(即输入代码)
因此,当电话通话结束时,您可以从通话活动开始第二个活动,例如如下所示:

 Intent intent = new Intent(this, SecondActivity.class);
 this.startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

this调用 Activity 的实例在哪里

如果手机之前已锁定,则刚刚启动的内容SecondActivity将自动锁定在锁屏后面(即,如果未解锁则无法访问)。

我刚刚在一个小型测试项目中测试了这种行为,如果您需要进一步的帮助,请询问。