Android,检查在其他 Activity 之前是否按下了后退按钮
Android, check if back button was pressed before in other Activity
我已经开始使用 Firebase 并做了一个简单的 activity 创建帐户并登录。
我一切都按预期工作,但是,一旦用户登录并进入菜单屏幕,我就注意到了一些事情。如果用户按下 android 设备上的后退按钮,您会期望该应用程序会关闭或返回到您之前所在的位置,但是由于 LoginActivity 中的 onStart() 它会将用户返回到菜单页面再次出现。我不想更改 onStart() 方法,因为我喜欢它会在您已有帐户时记录您。所以我尝试的是在菜单 activity 中按下后退按钮时关闭应用程序,如下所示:
@Override
public void onBackPressed() {
finish();
System.exit(0);
}
但是,这没有用,我仍然无法关闭应用程序,然后在菜单活动中按后退按钮,因为 LoginActivity 仍然让我返回。
这是登录活动:
public class LoginActivity extends AppCompatActivity {
// [START declare_auth]
private FirebaseAuth mAuth;
// [END declare_auth]
private static final String TAG = "EmailPassword";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// [START initialize_auth]
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
// [END initialize_auth]
}
//here we immediately check if user is already logged in then log in
@Override
protected void onStart() {
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null)
updateUI(currentUser);
}
private void updateUI(FirebaseUser currentUser) {
Intent mainIntent = new Intent(LoginActivity.this, MenuActivity.class);
Toast.makeText(this, "This is current user: " + currentUser, Toast.LENGTH_LONG).show();
startActivity(mainIntent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
public void createAccount(View view) {
final EditText emailEdit = (EditText) findViewById(R.id.email_field);
final String email = emailEdit.getText().toString();
final EditText passwordEdit = (EditText) findViewById(R.id.password_field);
final String password = passwordEdit.getText().toString();
Log.d(TAG, "createAccount:" + email);
// [START create_user_with_email]
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "createUserWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
try
{
throw Objects.requireNonNull(task.getException());
}
// if user enters wrong email.
catch (FirebaseAuthWeakPasswordException weakPassword)
{
Log.d(TAG, "onComplete: weak_password");
Toast.makeText(LoginActivity.this, "Password to weak", Toast.LENGTH_LONG).show();
}
// if user enters wrong password.
catch (FirebaseAuthInvalidCredentialsException malformedEmail)
{
Log.d(TAG, "onComplete: malformed_email");
Toast.makeText(LoginActivity.this, "Wrong email", Toast.LENGTH_LONG).show();
}
catch (FirebaseAuthUserCollisionException existEmail)
{
Log.d(TAG, "onComplete: exist_email");
Toast.makeText(LoginActivity.this, "Email already exists", Toast.LENGTH_LONG).show();
}
catch (Exception e)
{
Log.d(TAG, "onComplete: " + e.getMessage());
Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_SHORT).show();
Toast.makeText(LoginActivity.this, "Please try again", Toast.LENGTH_SHORT).show();
}
// If sign in fails, display a message to the user.
Log.w(TAG, "createUserWithEmail:failure", task.getException());
Toast.makeText(LoginActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
}
});
// [END create_user_with_email]
}
}
有没有一种方法可以关闭菜单中的应用程序 activity 或者如果我们通过按下 phone?
LoginActivity 将不再显示后退按钮。除非您重新打开应用程序或在那里做出意图。您可以尝试添加这个。
<activity
android:name=".LoginActivity"
android:noHistory="true" />
您可以修改您的意图添加标志Intent.FLAG_ACTIVITY_CLEAR_TASK
和 Intent.FLAG_ACTIVITY_NEW_TASK
private void updateUI(FirebaseUser currentUser) {
Intent mainIntent = new Intent(LoginActivity.this, MenuActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Toast.makeText(this, "This is current user: " + currentUser, Toast.LENGTH_LONG).show();
startActivity(mainIntent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
这会关闭之前的LogicActivity,不需要覆盖onBackPressed()
我已经开始使用 Firebase 并做了一个简单的 activity 创建帐户并登录。 我一切都按预期工作,但是,一旦用户登录并进入菜单屏幕,我就注意到了一些事情。如果用户按下 android 设备上的后退按钮,您会期望该应用程序会关闭或返回到您之前所在的位置,但是由于 LoginActivity 中的 onStart() 它会将用户返回到菜单页面再次出现。我不想更改 onStart() 方法,因为我喜欢它会在您已有帐户时记录您。所以我尝试的是在菜单 activity 中按下后退按钮时关闭应用程序,如下所示:
@Override
public void onBackPressed() {
finish();
System.exit(0);
}
但是,这没有用,我仍然无法关闭应用程序,然后在菜单活动中按后退按钮,因为 LoginActivity 仍然让我返回。
这是登录活动:
public class LoginActivity extends AppCompatActivity {
// [START declare_auth]
private FirebaseAuth mAuth;
// [END declare_auth]
private static final String TAG = "EmailPassword";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// [START initialize_auth]
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
// [END initialize_auth]
}
//here we immediately check if user is already logged in then log in
@Override
protected void onStart() {
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null)
updateUI(currentUser);
}
private void updateUI(FirebaseUser currentUser) {
Intent mainIntent = new Intent(LoginActivity.this, MenuActivity.class);
Toast.makeText(this, "This is current user: " + currentUser, Toast.LENGTH_LONG).show();
startActivity(mainIntent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
public void createAccount(View view) {
final EditText emailEdit = (EditText) findViewById(R.id.email_field);
final String email = emailEdit.getText().toString();
final EditText passwordEdit = (EditText) findViewById(R.id.password_field);
final String password = passwordEdit.getText().toString();
Log.d(TAG, "createAccount:" + email);
// [START create_user_with_email]
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "createUserWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
try
{
throw Objects.requireNonNull(task.getException());
}
// if user enters wrong email.
catch (FirebaseAuthWeakPasswordException weakPassword)
{
Log.d(TAG, "onComplete: weak_password");
Toast.makeText(LoginActivity.this, "Password to weak", Toast.LENGTH_LONG).show();
}
// if user enters wrong password.
catch (FirebaseAuthInvalidCredentialsException malformedEmail)
{
Log.d(TAG, "onComplete: malformed_email");
Toast.makeText(LoginActivity.this, "Wrong email", Toast.LENGTH_LONG).show();
}
catch (FirebaseAuthUserCollisionException existEmail)
{
Log.d(TAG, "onComplete: exist_email");
Toast.makeText(LoginActivity.this, "Email already exists", Toast.LENGTH_LONG).show();
}
catch (Exception e)
{
Log.d(TAG, "onComplete: " + e.getMessage());
Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_SHORT).show();
Toast.makeText(LoginActivity.this, "Please try again", Toast.LENGTH_SHORT).show();
}
// If sign in fails, display a message to the user.
Log.w(TAG, "createUserWithEmail:failure", task.getException());
Toast.makeText(LoginActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
}
});
// [END create_user_with_email]
}
}
有没有一种方法可以关闭菜单中的应用程序 activity 或者如果我们通过按下 phone?
LoginActivity 将不再显示后退按钮。除非您重新打开应用程序或在那里做出意图。您可以尝试添加这个。
<activity
android:name=".LoginActivity"
android:noHistory="true" />
您可以修改您的意图添加标志Intent.FLAG_ACTIVITY_CLEAR_TASK
和 Intent.FLAG_ACTIVITY_NEW_TASK
private void updateUI(FirebaseUser currentUser) {
Intent mainIntent = new Intent(LoginActivity.this, MenuActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Toast.makeText(this, "This is current user: " + currentUser, Toast.LENGTH_LONG).show();
startActivity(mainIntent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
这会关闭之前的LogicActivity,不需要覆盖onBackPressed()