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 语句。 :)