我正在开发一个Android应用程序,需要用户在执行任何其他操作之前登录。目前我已创建名为LoginScreen的主Activity,并且在成功登录后,此活动将启动另一个名为Home的Activity。但我发现这种方法存在问题。如果用户在Home活动中按下按钮怎么办?我不希望用户返回登录屏幕。什么是阻止用户这样做的正确方法。我是否需要处理按键事件?
答案 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
答案 5 :(得分:0)
在某些事件的LoginActivity中调用 startActivity(...)(例如登录按钮单击)。使用单独的数据库类来存储HomeActivity类中用户的用户名和密码。
处理 onKeyDown()事件以控制HomeActivity中的后退按钮(使用 finish()方法)。
在LoginActivity类的 OnCreate()方法中,使用数据库连接来检查用户名和&amp;密码已经存在于数据库表中,如果是,则调用 startActivity(),直接从LoginScreen转到HomeScreen。这不会显示LoginScreen。
希望这对你有用。 试试吧。