Android返回键异常求助:MainMenu返回时先最小化再回MainStartActivity
从你提供的代码来看,导致返回键异常的主要原因有两个可能的点,我来逐个拆解:
1. 手动更新配置触发Activity重建,打乱任务栈状态
你在代码中调用了getResources().updateConfiguration(config, getResources().getDisplayMetrics());,这个方法在Android 7.0(API 24)之后已经被标记为过时,更关键的是:调用它会触发当前MainScreenActivity的重建。
而你紧接着又执行了startActivity(i);和finish();——系统在处理Activity重建的同时,还要处理页面跳转和当前页面销毁的操作,直接导致任务栈状态混乱。当你从MainMenu按返回键时,系统会先尝试整理混乱的栈,表现为应用先最小化,再回到MainStartActivity。
2. 可能存在的启动模式配置异常
如果MainMenu在AndroidManifest.xml中设置了非standard的启动模式(比如singleTask、singleInstance),或者配置了android:taskAffinity属性,会导致MainMenu被启动到一个独立的任务栈中。此时按返回键,会先退出这个独立任务栈(应用最小化),原来任务栈中的MainStartActivity才会显示出来。
具体修复方案
方案一:移除过时配置代码,改用全局语言配置
- 删除当前代码中的配置更新逻辑:把这段代码删掉
Configuration config = new Configuration(); config.locale = Locale.ENGLISH; getResources().updateConfiguration(config, getResources().getDisplayMetrics());
- 在全局层级统一处理语言配置:
- 新建一个
BaseActivity让所有页面继承,在attachBaseContext方法中统一应用语言:
- 新建一个
@Override protected void attachBaseContext(Context newBase) { LanguageType languageType = PrefUtils.getLanguage(newBase); // 用createConfigurationContext创建适配语言的Context(Android 7.0+推荐方式) Configuration config = new Configuration(newBase.getResources().getConfiguration()); if (languageType.languageType.equalsIgnoreCase(AppConstants.English)) { config.setLocale(Locale.ENGLISH); } else { // 其他语言设置 config.setLocale(Locale.getDefault()); } Context context = newBase.createConfigurationContext(config); super.attachBaseContext(context); }
- 保留跳转逻辑:设置完语言偏好后,直接启动
MainMenu并关闭当前页面:
btnCheck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LanguageType languageType=new LanguageType(); if(selectedLanguage.equalsIgnoreCase(AppConstants.English)){ languageType.languageType=AppConstants.English; PrefUtils.setLanguage(languageType,MainScreenActivity.this); Log.e("Selected Language",PrefUtils.getLanguage(MainScreenActivity.this).languageType); } Intent i=new Intent(MainScreenActivity.this,MainMenu.class); startActivity(i); finish(); } });
方案二:检查并修正MainMenu的启动模式
打开AndroidManifest.xml,找到MainMenu的Activity配置,确保它使用默认的standard启动模式,无额外任务栈配置:
<activity android:name=".MainMenu" android:launchMode="standard" />
如果之前设置了singleTask或singleInstance,改成standard即可。
按照上面的方案修改后,返回键逻辑应该会恢复正常:从MainMenu按返回键会直接回到MainStartActivity,不会出现先最小化的异常。
内容的提问来源于stack exchange,提问作者Physther

