使用密码保护应用程序

Protect application with password

我有一个应用程序(扩展),它在后台运行一些服务来监控信标。检查您是否在范围内或超出范围,然后执行一些操作。

我的应用程序中只有一个 Activity,那就是设置 Activity。该服务在启动后自动启动,并无限期运行。当有人试图打开应用程序时,除非提供正确的密码,否则设置Activity 不应可用。

所以在 onPause() 和 onResume() 中,我想启动一个要求输入密码的对话框。当输入正确的密码时(Retrofit 检查这个和 returns 一个布尔值),他被允许进入设置 Activity.

问题:如何让我的 activity 不可见 onPause() 以及如何在正确密码后使其再次可见(在 onResume() 中启动对话框)。

我可以想到一个解决方案,那就是向我的 settings_view.xml 添加另一个视图,让它填充父级并在正确的密码和 VISIBILITY.VISIBLE @onPause( ). 我想在 onPause() 中执行此操作,因为那时该人在转到最近的应用程序屏幕时不能 "see" 任何东西。但这似乎是一个非常草率的解决方案。

我是否可以 blackout/tint onPause() 中的布局并在输入正确的密码后删除 blackout/tint?

感谢您的建议:)

Problem: How do I make my activity invisible onPause() and how do I make it visible again after correct password (launch dialog in onResume()).

您应该为此考虑 activity 生命周期的其余部分。 如果您是从互联网上获取一些信息,那么您的应用程序可能会遇到很多问题。您可能信号不好,没有可用网络,甚至网络连接适配器已关闭。

考虑一下: Activity "login" onCreate:用所需的文件创建一个平淡无奇的 activity,然后是一个提交按钮。提交后,查询网络状态以及您用于登录的任何内容。然后将结果保存一段时间(假设一天或 30 分钟,根据您的应用程序感觉最好),通常 SharedPreferences 就可以了。

Activity "SettingsActivity" onResume: 检查保存的数据是否允许用户看到 Activity。如果没有,完成 activity,然后开始 "login"。

我解决了这个问题如下:

我包含了一个布局:

文件activity_settings.xml

<include layout="@layout/view_authentication"
    android:id="@+id/authenticationView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

文件view_authentication.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/authenticationView"
            android:clipToPadding="false">

<LinearLayout
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:padding="10dp">

    <EditText
        android:id="@+id/authentication_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:hint="Password"
        android:password="true"/>

    <Button
        android:id="@+id/authentication_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="@string/authentication_button"/>

</LinearLayout>
</RelativeLayout>

在我的 SettingsActivity.java 中,我在 onCreate() 中添加了以下行。这可以防止截取屏幕截图并阻止在最近的应用程序中看到任何内容

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);

在 onResume() 中,它在第一次打开应用程序或重新打开应用程序之前被调用。我调用以下方法:

public void showAuthenticationFrame() {
    authenticationView.setVisibility(View.VISIBLE);
    contentFrame.setVisibility(View.GONE);
}

输入正确密码后,我反其道而行之, 我将 authenticationView 设置为 GONE,将 contentFrame 设置为 VISIBLE。