Android - Main activity 无故结束?
Android - Main activity finishes for no reason?
在主要 activity 上,我通过读取 SharedPreferences 检查用户是否是第一次登录。然后我开始一个新的简单 Login/SignUp activity.
当按下第二个 activity 上的 "LOGIN" 按钮时,我想 return 用户最后一次登录主 activity (我使用 getIntent().putExtra()
).
出于某种原因,当我按下 "LOGIN" 时,第二个 activity 关闭,然后我看到一个带有上次登录时间的 Toast,但应用程序立即关闭!好像有什么东西正在关闭主 activity。我不知道为什么...这是代码:
主要Activity:
package com.technion.saharav.technionmobilehomework13_3_15;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final int REQ_CODE_LOGIN = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivityForResult(intent, REQ_CODE_LOGIN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQ_CODE_LOGIN:
if (resultCode == LoginActivity.RESULT_FAIL) {
finish();
}
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(),
"Last time connected: " + data.getExtras().get("lastLoginTime").toString(),
Toast.LENGTH_LONG).show();
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
登录Activity:
package com.technion.saharav.technionmobilehomework13_3_15;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Date;
public class LoginActivity extends Activity {
protected static int RESULT_FAIL = -1;
EditText editext_username, editext_password;
View tv;
Button bt;
private String username, password;
Intent intent;
SharedPreferences pref;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
editext_username = (EditText) findViewById(R.id.editText_Username);
editext_password = (EditText) findViewById(R.id.editText_Password);
tv = findViewById(R.id.textView_loginBottom);
bt = (Button) findViewById(R.id.buttonClick);
intent = getIntent();
pref = getApplicationContext().getSharedPreferences("LoginInfo", MODE_PRIVATE);
editor = pref.edit();
if (!pref.getBoolean("firstLogin", true)) {
username = pref.getString("username", "");
password = pref.getString("password", "");
tv.setVisibility(View.GONE);
}
else {
bt.setText("CREATE");
}
}
public void buttonClick(View view) {
String userInput = editext_username.getText().toString();
String passwordInput = editext_password.getText().toString();
switch (bt.getText().toString()) {
case "LOGIN":
if (editext_username.getText().toString().equals(username)
&& editext_password.getText().toString().equals(password)) {
intent.putExtra("lastLoginTime", pref.getString("lastLoginTime", ""));
editor.putString("lastLoginTime", Calendar.getInstance().getTime().toString());
editor.commit();
setResult(RESULT_OK, intent);
finish();
} else {
Toast.makeText(getApplicationContext(),
"Login failed. Check the username or password and try again.", Toast.LENGTH_LONG).show();
}
break;
case "CREATE":
if (userInput.length() > 0 && passwordInput.length() > 0) {
editor.putString("username", userInput);
editor.putString("password", passwordInput);
editor.putString("lastLoginTime", Calendar.getInstance().getTime().toString());
editor.putBoolean("firstLogin", false);
editor.commit();
finish();
}
else {
Toast.makeText(getApplicationContext(),
"Username/Password cannot remain empty!", Toast.LENGTH_LONG).show();
}
break;
}
}
@Override
public void onBackPressed() {
setResult(RESULT_FAIL, intent);
super.onBackPressed();
}
}
您定义了protected static int RESULT_FAIL = -1;
... 与 RESULT_OK
.
的值相同
所以当你的onActivityResult()
运行时,条件resultCode == LoginActivity.RESULT_FAIL
为真,所以finish()
被执行。请记住,finish()
只是告诉系统结束你的 activity;它不会像 return
那样弹出调用堆栈,因此执行会继续。
然后因为你编码 if
而不是 else if
,下一个条件 resultCode == RESULT_OK
也 评估为真,所以你的 Toast 显示.
然后因为你调用了 finish()
你的 Activity 退出了。
定义结果代码时,可以使用Activity.RESULT_FIRST_USER
作为起始值;它被定义为 1.
最好的方法是这样做:
public static final int RESULT_FAIL = RESULT_FIRST_USER;
public static final int RESULT_OTHER = RESULT_FIRST_USER + 1;
public static final int RESULT_CRASH = RESULT_FIRST_USER + 2;
等等等
我也使用嵌套的switch
语句,外面是请求代码,里面是结果代码。然后我知道只有一个块将要执行......除非我忘记 break
语句。 :)
在主要 activity 上,我通过读取 SharedPreferences 检查用户是否是第一次登录。然后我开始一个新的简单 Login/SignUp activity.
当按下第二个 activity 上的 "LOGIN" 按钮时,我想 return 用户最后一次登录主 activity (我使用 getIntent().putExtra()
).
出于某种原因,当我按下 "LOGIN" 时,第二个 activity 关闭,然后我看到一个带有上次登录时间的 Toast,但应用程序立即关闭!好像有什么东西正在关闭主 activity。我不知道为什么...这是代码:
主要Activity:
package com.technion.saharav.technionmobilehomework13_3_15;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final int REQ_CODE_LOGIN = 10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
startActivityForResult(intent, REQ_CODE_LOGIN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQ_CODE_LOGIN:
if (resultCode == LoginActivity.RESULT_FAIL) {
finish();
}
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(),
"Last time connected: " + data.getExtras().get("lastLoginTime").toString(),
Toast.LENGTH_LONG).show();
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
}
登录Activity:
package com.technion.saharav.technionmobilehomework13_3_15;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Date;
public class LoginActivity extends Activity {
protected static int RESULT_FAIL = -1;
EditText editext_username, editext_password;
View tv;
Button bt;
private String username, password;
Intent intent;
SharedPreferences pref;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
editext_username = (EditText) findViewById(R.id.editText_Username);
editext_password = (EditText) findViewById(R.id.editText_Password);
tv = findViewById(R.id.textView_loginBottom);
bt = (Button) findViewById(R.id.buttonClick);
intent = getIntent();
pref = getApplicationContext().getSharedPreferences("LoginInfo", MODE_PRIVATE);
editor = pref.edit();
if (!pref.getBoolean("firstLogin", true)) {
username = pref.getString("username", "");
password = pref.getString("password", "");
tv.setVisibility(View.GONE);
}
else {
bt.setText("CREATE");
}
}
public void buttonClick(View view) {
String userInput = editext_username.getText().toString();
String passwordInput = editext_password.getText().toString();
switch (bt.getText().toString()) {
case "LOGIN":
if (editext_username.getText().toString().equals(username)
&& editext_password.getText().toString().equals(password)) {
intent.putExtra("lastLoginTime", pref.getString("lastLoginTime", ""));
editor.putString("lastLoginTime", Calendar.getInstance().getTime().toString());
editor.commit();
setResult(RESULT_OK, intent);
finish();
} else {
Toast.makeText(getApplicationContext(),
"Login failed. Check the username or password and try again.", Toast.LENGTH_LONG).show();
}
break;
case "CREATE":
if (userInput.length() > 0 && passwordInput.length() > 0) {
editor.putString("username", userInput);
editor.putString("password", passwordInput);
editor.putString("lastLoginTime", Calendar.getInstance().getTime().toString());
editor.putBoolean("firstLogin", false);
editor.commit();
finish();
}
else {
Toast.makeText(getApplicationContext(),
"Username/Password cannot remain empty!", Toast.LENGTH_LONG).show();
}
break;
}
}
@Override
public void onBackPressed() {
setResult(RESULT_FAIL, intent);
super.onBackPressed();
}
}
您定义了protected static int RESULT_FAIL = -1;
... 与 RESULT_OK
.
所以当你的onActivityResult()
运行时,条件resultCode == LoginActivity.RESULT_FAIL
为真,所以finish()
被执行。请记住,finish()
只是告诉系统结束你的 activity;它不会像 return
那样弹出调用堆栈,因此执行会继续。
然后因为你编码 if
而不是 else if
,下一个条件 resultCode == RESULT_OK
也 评估为真,所以你的 Toast 显示.
然后因为你调用了 finish()
你的 Activity 退出了。
定义结果代码时,可以使用Activity.RESULT_FIRST_USER
作为起始值;它被定义为 1.
最好的方法是这样做:
public static final int RESULT_FAIL = RESULT_FIRST_USER;
public static final int RESULT_OTHER = RESULT_FIRST_USER + 1;
public static final int RESULT_CRASH = RESULT_FIRST_USER + 2;
等等等
我也使用嵌套的switch
语句,外面是请求代码,里面是结果代码。然后我知道只有一个块将要执行......除非我忘记 break
语句。 :)