在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