我有一个具有主要活动的Android应用程序,该应用程序首次启动时将运行注册活动以供用户登录(或者如果用户尚未登录)。在注册活动中,后退按钮不执行任何操作。这是我的代码:
的Manifest.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");
...
}
}
RegisterActivity.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()
覆盖,但我只是为了尝试它。正如您所看到的,我尝试使用后退按钮将用户带回主屏幕(因为返回主要活动只会将用户带回注册活动,因为他们仍然没有记录英寸
但是当我按下Register Activity里面的后退按钮时没有任何反应,没有日志,没有。我不知道这是否与使用startActivityForResult()
调用的活动有关。但是,当按下后退按钮时,即使onActivityResult()
也没有被回叫。
答案 0 :(得分: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);
}
答案 1 :(得分:0)
尝试快速和准确我遗漏了一些RegisterActivity.java的代码,因为大多数其他代码都没有预先知道错误。但是我确实错过了一个对我来说似乎不应该影响Back按钮的部分,但确实如此。
@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()
覆盖了Back按钮。我将以下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
处于焦点状态,每次按下“返回”按钮时,它总是调用自定义onKeyListener,而不是按下“返回”按钮时动作处于焦点状态。意味着覆盖的onBackPressed()
和onKeyDown()
从未被调用过。我已经保留了添加的onBackPressed()
函数作为备份,如果usernameField
以某种方式失去焦点。