1

我有一个具有 Main Activity 的 android 应用程序,它在第一次启动时将运行 Register Activity 以供用户登录(或者如果用户尚未登录)。在注册活动中,后退按钮不执行任何操作。这是我的代码:

清单.xml:

<activity
    android:name="com.ddv.android.gcm.support.app.MainActivity"
    android:label="@string/title_activity_main"
    android:screenOrientation="portrait" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity 
    android:name="com.ddv.android.gcm.support.app.RegisterActivity"
    android:screenOrientation="portrait" >
</activity>

MainActivity.java(调用注册活动):

protected void launchRegistrationIntent() {
    Intent intent = new Intent(getBaseContext(), RegisterActivity.class);
    startActivityForResult(intent, GET_USERNAME);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "OnActivityResult");
    if (data != null) {
        final String username = data.getStringExtra("USERNAME");
        ...
    }
}

注册活动.java:

@Override
public void onBackPressed() {
    Log.d(TAG, "Back button pressed");
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Log.d(TAG, "Back button pressed (old)");
        Intent startMain = new Intent(Intent.ACTION_MAIN);
        startMain.addCategory(Intent.CATEGORY_HOME);
        startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startMain);
    }
    return true;
}

该应用程序在 Android 4.0 或更高版本上运行,因此我认为我不需要onKeyDown()覆盖,但我将其放入只是为了尝试。如您所见,我正在尝试使后退按钮将用户带回主屏幕(因为返回主活动只会将用户带回注册活动,因为他们仍未登录。

但是当我按下注册活动内的后退按钮时,什么也没有发生,没有日志,什么都没有。我不知道这是否与被调用的活动有关startActivityForResult()。但是即使onActivityResult()按下后退按钮也不会被回调。

4

2 回答 2

0

尝试这种方式可能会解决您的问题:

@Override
public void onBackPressed() {
    Log.d(TAG, "Back button pressed");
    Intent startMain = new Intent(RegisterActivity.this, MainActivity.class);
    startMain.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(startMain);
}
于 2015-04-30T16:37:59.930 回答
0

为了快速准确,我省略了 RegisterActivity.java 的一些代码,因为大多数其他代码都不会导致错误。但是我确实错过了一个对我来说似乎不应该影响“后退”按钮的部分,但确实如此。

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "Starting RegisterActivity");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);
    regId = GCMRegistrar.getRegistrationId(this);
    Log.d(TAG, "regId = " + regId);

    usernameField = (TextView) findViewById(R.id.usernameField);
    registerButton = (Button) findViewById(R.id.registerButton);

    usernameField.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                verifyUsername();
            }
            return true;
        }
    });

    verifyingDlg = new ProgressDialog(this);
    verifyingDlg.setMessage("Verifying Username...");
}

usernameField.setOnKeyListener()覆盖了“后退”按钮。我向侦听器添加了以下 if 语句,现在我的后退按钮按预期工作(将用户带回他们的主屏幕)。

    usernameField.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                verifyUsername();
            }
            if ((keyCode == KeyEvent.KEYCODE_BACK)) {
                Log.d(TAG, "Back button pressed (old)");
                Intent startMain = new Intent(Intent.ACTION_MAIN);
                startMain.addCategory(Intent.CATEGORY_HOME);
                startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(startMain);
            }
            return true;
        }
    });

我的猜测是因为usernameField它总是在每次按下 Back 按钮时调用自定义 onKeyListener 而不是在按下 Back 按钮时好像 Action 是焦点。意味着被覆盖onBackPressed()并且onKeyDown()从未被调用。如果不知何故失去焦点,我一直保留添加的onBackPressed()功能作为备份。usernameField

于 2015-05-01T19:34:18.743 回答