在Android中创建登录屏幕/活动的正确方法是什么?

在Android中创建登录屏幕/活动的正确方法是什么?,android,login,android-activity,Android,Login,Android Activity,我正在开发一个Android应用程序,它要求用户在做任何其他事情之前先登录。目前,我已经创建了名为LoginScreen的主活动,成功登录后,此活动将启动另一个名为Home的活动。但我发现这种方法有一个问题。如果用户在“主页”活动中按下“后退”按钮,该怎么办?我不希望用户返回登录屏幕。阻止用户这样做的正确方法是什么。我需要处理按键事件吗?在LoginScreen活动中调用startActivity(…)后,调用finish()。这将从活动堆栈中删除该活动,因此,一旦您进入家庭活动,按back键将

我正在开发一个Android应用程序,它要求用户在做任何其他事情之前先登录。目前,我已经创建了名为LoginScreen的主活动,成功登录后,此活动将启动另一个名为Home的活动。但我发现这种方法有一个问题。如果用户在“主页”活动中按下“后退”按钮,该怎么办?我不希望用户返回登录屏幕。阻止用户这样做的正确方法是什么。我需要处理按键事件吗?

在LoginScreen活动中调用
startActivity(…)
后,调用
finish()
。这将从活动堆栈中删除该活动,因此,一旦您进入家庭活动,按back键将基本上关闭您的应用程序。

在某些事件的LoginActivity中调用startActivity(…)。还可以使用单独的数据库类存储HomeActivity类中用户的用户名和密码

处理用于在HomeActivity中控制后退按钮的onKeyDown()事件(使用finish()方法)

在LoginActivity类的OnCreate()方法中,使用数据库连接检查数据库表中是否已经存在用户名和密码。如果是,则调用那里的startActivity()直接从LoginScreen转到主屏幕。这将不显示LoginScreen

希望这对你有用。
试试看。

我最终做的是让我的家庭活动处理intentandroid.intent.action.MAIN。Home activity在启动时检查用户是否已登录(使用共享首选项),如果未登录,则启动LoginActivity并自行调用finish()

成功登录后的LoginActivity将启动主活动,这一次由于用户已登录,主活动将继续其正常过程。LoginActivity在清单文件中声明如下:

<activity android:name="LoginScreen" android:label="@string/app_name"
    android:noHistory="true" android:excludeFromRecents="true">
</activity>

对于LoginActivity,将noHistory和excludeFromRecents设置为true意味着用户无法使用“后退”按钮返回此活动

尝试将标志设置为意图

示例:

new Intent(context, SomeActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

有关旗帜的更多信息: 见:(下文)

要做到这一点,您应该创建一个没有显示的单一启动器活动(使用Android的NodePlay主题),该活动运行是否进入主屏幕或登录/注册的逻辑

首先,在你的清单中:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.android">

<-- Permissions etc -->

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name">

    <activity
        android:name=".onboarding.StartupActivity"
        android:label="@string/app_name"
        android:launchMode="singleInstance"
        android:theme="android:style/Theme.NoDisplay">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop" />

    <activity
        android:name=".authentication.controller.AuthenticationActivity"
        android:label="@string/title_sign_in"
        android:launchMode="singleTask"
        android:windowSoftInputMode="adjustResize|stateHidden" />

    <-- Other activities, services, etc -->
</application>
要点如下:

LoginActivity.xml

 <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fitsSystemWindows="true"
    android:background="#263238">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="80dp"
        android:paddingLeft="16dp"
        android:paddingRight="16dp">

        <!-- App Logo -->
        <ImageView android:id="@+id/logo"
            android:src="@drawable/logo"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_marginBottom="20dp"
            android:layout_gravity="center_horizontal" />

        <!--Title TextView-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="STOCK BUDDY"
            android:id="@+id/title"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="#7B869B"
            android:layout_marginBottom="24dp"
            android:layout_gravity="center_horizontal"/>

        <!--User Email-->
        <EditText
            android:id="@+id/login_email"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="5dp"
            android:layout_centerVertical="true"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:ellipsize="start"
            android:gravity="center"
            android:hint="Email"
            android:paddingLeft="16dp"
            android:paddingRight="16dp"
            android:textColorHint="#cccccc"
            android:textColor="#7B869B"
            android:maxLength="40"
            android:maxLines="1"
            android:inputType="textEmailAddress"
            android:background="@drawable/edittextshape"/>

        <!-- User Password -->
        <EditText
            android:id="@+id/login_password"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="10dp"
            android:layout_centerVertical="true"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:ellipsize="start"
            android:gravity="center"
            android:paddingRight="16dp"
            android:paddingLeft="16dp"
            android:hint="Password"
            android:textColor="#7B869B"
            android:textColorHint="#cccccc"
            android:maxLength="20"
            android:maxLines="1"
            android:inputType="textPassword"
            android:background="@drawable/edittextshape"/>

        <!--Login Button-->
        <android.support.v7.widget.AppCompatButton
            android:id="@+id/btn_login"
            android:layout_width="fill_parent"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="24dp"
            android:background="@drawable/buttonshape"
            android:text="Login"
            android:textSize="20sp"
            android:layout_height="40dp"
            android:textColor="#ffffff"
            android:shadowRadius="5"
            android:onClick="Login"/>

        <!--signup Link TextView-->
        <TextView android:id="@+id/link_signup"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="24dp"
            android:text="No account yet? Create one"
            android:gravity="center"
            android:textSize="12sp"
            android:textColor="#7B869B"/>

    </LinearLayout>
</ScrollView>
edittextshape.xml

    <?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:thickness="0dp"
    android:shape="rectangle">
    <solid android:color="#ffffff"/>
    <stroke android:width="1dp"
        android:color="#ffffff" />
    <corners android:radius="44dp" />
</shape>

请参阅上的完整代码


如果我这样做,那么无论出于何种原因,当我的应用程序进入后台时,就像我按下主屏幕时一样,然后从主屏幕上按下我的应用程序图标,将再次显示登录活动,该活动将添加到堆栈中的主活动顶部。然后,您需要在创建(…)时签入
,如果您有足够的数据继续,则启动“主页”活动。如果没有,请等待用户登录。如果您需要一些简单的东西,您可以使用
SharedReferences
来执行此操作。在LoginActivity重新开始主页后,为什么不立即
finish()
完成LoginActivity,就像您使用主页活动一样?为什么
android:noHistory
在这里是一个更好的方法?好问题skrebbel:)请问,您能解释一下您的解决方案吗,或者发布
noHistory
finish()之间的差异吗
approach?@skrebbel plz请看我对Jason-Robinson答案的评论。noHistory的一个问题是,一旦将下一个活动添加到堆栈中,noHistory活动可能会被销毁。(很可能是在那个时候。)当用户点击后退按钮时,活动不仅仅被跳过……它被预先销毁。因此,如果您的登录活动具有隐私策略或其他可能推到后台堆栈的内容,您的登录pag可能会消失。为什么这种方法比将登录活动转换为启动器活动,然后在登录活动上检查用户是否登录更好?可能存在重复的
 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <corners
        android:radius="44dp"
        />
    <gradient
        android:angle="45"
        android:centerX="35%"
        android:centerColor="#63D0C3"
        android:startColor="#70DB9A"
        android:endColor="#56C5EE"
        android:type="linear"
        />
    <padding
        android:left="0dp"
        android:top="0dp"
        android:right="0dp"
        android:bottom="0dp"
        />
    <stroke
        android:width="0dp"
        android:color="#878787"
        />
</shape>
    <?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:thickness="0dp"
    android:shape="rectangle">
    <solid android:color="#ffffff"/>
    <stroke android:width="1dp"
        android:color="#ffffff" />
    <corners android:radius="44dp" />
</shape>