React Native:在 Android 上使用 FLAG_SECURE 实现自定义背景屏幕

React Native: Implementing Custom Background Screen with FLAG_SECURE on Android

提问人:Siddhant Shelake 提问时间:9/18/2023 最后编辑:Siddhant Shelake 更新时间:9/18/2023 访问量:154

问:

我正在开发一个 React Native 项目,当应用程序进入后台时,我需要从 Android“概述屏幕”中隐藏应用程序的内容。我尝试使用以下代码:

getWindow().setFlags(
  WindowManager.LayoutParams.FLAG_SECURE,
  WindowManager.LayoutParams.FLAG_SECURE
);

这成功地隐藏了内容,但现在我想显示自定义屏幕而不是默认的白屏。

这是我在 MainActivity 中实现的代码:

public class MainActivity extends ReactActivity {

    private LinearLayout mainLayout;
    private LinearLayout secureLayout;

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(
            WindowManager.LayoutParams.FLAG_SECURE,
            WindowManager.LayoutParams.FLAG_SECURE
        );

        setContentView(R.layout.secure_layout);
        secureLayout = findViewById(R.id.secureLayout); 
    }

    @Override
    protected void onStart() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);
        mainLayout.setVisibility(View.VISIBLE);
        secureLayout.setVisibility(View.GONE);
        super.onStart();   
    }

    @Override
    protected void onPause() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        mainLayout.setVisibility(View.GONE);
        secureLayout.setVisibility(View.VISIBLE);
        super.onPause();
    }

    @Override
    protected ReactActivityDelegate createReactActivityDelegate() {
        return new DefaultReactActivityDelegate(
            this,
            getMainComponentName(),
            DefaultNewArchitectureEntryPoint.getFabricEnabled()
        );
    }
}

但是,此代码未提供预期的结果。自定义屏幕未按预期显示。谁能帮我确定我哪里出错了,或者提出更好的方法来实现这一目标?

谢谢!

React-Native Android-Studio 安全性

评论


答:

1赞 DinhNguyen 9/18/2023 #1
  1. 将主布局设置为一个 id(例如mainLayout)
  2. 创建自定义屏幕 (.xml) 以在应用在后台显示。为它设置一个 id(比如secureLayout)
  3. 将以下代码添加到您的活动中:
LinearLayout mainLayout, secureLayout;

@Override
protected void onPause() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    mainLayout.setVisibility(View.GONE);
    secureLayout.setVisibility(View.VISIBLE);
    super.onPause();
}

@Override
protected void onStart() {
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE);
    mainLayout.setVisibility(View.VISIBLE);
    secureLayout.setVisibility(View.GONE);
    super.onResume();
}

评论

0赞 Siddhant Shelake 9/18/2023
我们应该在其中初始化私有 LinearLayout mainLayout;私有 LinearLayout secureLayout;