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

我正在开发一个Android应用程序,需要用户在做任何事情之前login。 目前我已经创build了名为LoginScreen的主要活动,成功login后,此活动将启动另一个名为Home的活动。 但是我发现这种方法存在问题。 如果用户按下主页活动中的button,该怎么办? 我不希望用户回到login屏幕。 什么是阻止用户这样做的正确方法。 我需要处理重要新闻事件吗?

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

login成功后的LoginActivity启动了主要活动,这次由于用户login,主要活动将继续正常进行。 LoginActivity在清单文件中声明如下:

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

为LoginActivity设置noHistory和excludeFromRecents为true意味着用户不能使用后退button返回到这个活动。

在LoginScreen活动中调用startActivity(...)后,调用finish() 。 这将从活动堆栈中移除该活动,因此,一旦您进入“主页”活动,按回就会基本closures您的应用程序。

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上查看完整的代码;

login屏幕的图像

尝试设置标志的意图。

例:

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

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

在某个事件(例如,loginbutton单击)中的LoginActivity中调用startActivity(… )。 使用一个单独的数据库类来存储HomeActivity类的用户的用户名和密码。

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

在LoginActivity类的OnCreate()方法中,使用数据库连接检查数据库表中是否已存在用户名和密码,如果是,则调用startActivity() ,直接从LoginScreen进入HomeScreen.This将不显示LoginScreen。

希望这会为你工作。 尝试一下。

请参阅: https : //stackoverflow.com/a/41290453/4560689 (下面的文本)

要做到这一点,你应该创build一个没有显示(使用Android的NoDisplay主题)的启动器活动,运行是否进入主屏幕或login/注册的逻辑。

首先,在你的清单中:

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