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

时间:2011-05-02 15:34:41

标签: android login android-activity

我正在开发一个Android应用程序,需要用户在执行任何其他操作之前登录。目前我已创建名为LoginScreen的主Activity,并且在成功登录后,此活动将启动另一个名为Home的Activity。但我发现这种方法存在问题。如果用户在Home活动中按下按钮怎么办?我不希望用户返回登录屏幕。什么是阻止用户这样做的正确方法。我是否需要处理按键事件?

6 个答案:

答案 0 :(得分:49)

我最终做的是让我的Home活动处理意图 android.intent.action.MAIN 。家庭活动在启动时会检查用户是否已登录(使用共享首选项),如果不是,则启动LoginActivity并在其自身上调用finish()。

成功登录后的

LoginActivity启动Main活动,这次因为用户已登录,Main活动将继续正常运行。 LoginActivity在清单文件中声明如下:

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

为LoginActivity设置noHistory和excludeFromRecents为true意味着用户无法使用后退按钮返回此活动。

答案 1 :(得分:22)

在LoginScreen活动中致电startActivity(...)后,请致电finish()。这将从活动堆栈中删除该活动,因此在您进行主页活动后,按下该按钮将基本关闭您的应用。

答案 2 :(得分:1)

  

尝试为Intent设置标志。

示例:

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

有关旗帜的更多信息: http://developer.android.com/reference/android/content/Intent.html#nestedclasses

答案 3 :(得分:1)

请参阅:https://stackoverflow.com/a/41290453/4560689(下方文字)

要做到这一点,您应该使用No Display(使用Android&#39; NoDisplay主题)创建一个启动器活动,该活动运行是否转到主屏幕或登录/注册的逻辑。

首先,在你的清单中:

<?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>

然后,你的StartupActivity:

package com.example.android.onboarding;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.example.android.MainActivity;

import com.example.android.authentication.controller.AuthenticationActivity;

import com.example.android.util.ResourceUtils;

public class StartupActivity extends Activity {
    private static final AUTHENTICATION_REQUEST_CODE = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (isLoggedIn()) {
            Intent startupIntent = new Intent(this, MainActivity.class);
            startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(startupIntent);
            finish();
        } else {
            Intent startupIntent = new Intent(this, AuthenticationActivity.class);
            startActivityForResult(startupIntent, AUTHENTICATION_REQUEST_CODE);
        }

        super.onCreate(savedInstanceState);
    }

    private boolean isLoggedIn() {
        // Check SharedPreferences or wherever you store login information
        return this.getSharedPreferences("my_app_preferences", Context.MODE_PRIVATE).getBoolean("loggedIn", false);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == AUTHENTICATION_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            Intent startupIntent = new Intent(this, MainActivity.class);
            startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(startupIntent);
        }

        finish();
    }
}

请点击此处:https://gist.github.com/chanakin/c44bf1c6a9a80d2640440b5aaa92c8ee

答案 4 :(得分:1)

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>

<强> buttonshape.xml

 <?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>

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>

.....................

请参阅完整代码 https://androidpugnator.wordpress.com/2017/03/12/android-login-and-signup-screens

Image of login Screen

答案 5 :(得分:0)

在某些事件的LoginActivity中调用 startActivity(...)(例如登录按钮单击)。使用单独的数据库类来存储HomeActivity类中用户的用户名和密码。

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

在LoginActivity类的 OnCreate()方法中,使用数据库连接来检查用户名和&amp;密码已经存在于数据库表中,如果是,则调用 startActivity(),直接从LoginScreen转到HomeScreen。这不会显示LoginScreen。

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