Android中调用finish()后应用直接退出,未返回至前序Activity的onActivityResult()
首先,我来梳理下你遇到的核心问题:从ContactsActivity用startActivityForResult启动SearchContactActivity,选择结果后调用setResult+finish(),但没有回到ContactsActivity,反而应用看似关闭,过几秒启动了NameAndImage,还出现日志清空的情况。
结合你的代码和现象,我判断最可能的原因是**ContactsActivity被系统回收,重建时触发了跳转到NameAndImage的逻辑**,下面是具体分析和解决步骤:
1. 核心原因:Activity被系统回收导致的重建跳转
Android系统在内存不足时,会销毁后台的Activity(比如ContactsActivity在SearchContactActivity前台运行时)。当SearchContactActivity调用finish()后,系统会重建ContactsActivity,如果你的ContactsActivity的onCreate方法里有**判断用户是否完善信息(比如姓名、头像)并自动跳转到NameAndImage**的逻辑,就会出现这种“看似关闭,然后打开NameAndImage”的现象。
同时,进程如果被系统重启,之前的日志会被清空,这也解释了你看不到相关日志的问题。
2. 解决方案:避免Activity重建时触发跳转逻辑
检查ContactsActivity的onCreate方法,看看是否有类似下面的跳转代码:
// 假设这是你判断用户是否完善信息的逻辑 SaveSharedPreference sp = new SaveSharedPreference(); if (TextUtils.isEmpty(sp.getFirstName(this))) { Intent intent = new Intent(this, NameAndImage.class); startActivity(intent); finish(); }
如果有,你需要添加savedInstanceState != null的判断,区分首次启动和重建场景:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contacts); SaveSharedPreference sp = new SaveSharedPreference(); // 只有首次启动(savedInstanceState为null)时才执行跳转 if (TextUtils.isEmpty(sp.getFirstName(this)) && savedInstanceState == null) { Intent intent = new Intent(this, NameAndImage.class); startActivity(intent); finish(); return; } // 其他初始化代码... // 启动SearchContactActivity的代码 }
savedInstanceState不为null时,说明是Activity被系统回收后重建的,这时候不需要再跳转到NameAndImage,直接恢复状态即可。
3. 辅助排查步骤
为了进一步验证问题,你可以做下面的操作:
添加日志跟踪Activity生命周期:在
ContactsActivity的onCreate、onSaveInstanceState、onDestroy方法中添加日志,比如:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("ContactsActivity", "onCreate, savedInstanceState: " + (savedInstanceState == null ? "null" : "not null")); // ...其他代码 } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.i("ContactsActivity", "onSaveInstanceState called - Activity will be destroyed"); }如果看到
onSaveInstanceState的日志,说明ContactsActivity确实被系统回收了。查看任务栈状态:使用adb命令查看当前Activity栈:
adb shell dumpsys activity activities你可以看到
SearchContactActivityfinish前后的栈变化,确认NameAndImage是否在栈中,以及ContactsActivity的状态。验证setResult逻辑:在
SearchContactActivity的setResultForPreviousAcitvity方法中添加日志,确认setResult和finish()被正确执行:public void setResultForPreviousAcitvity() { Intent data = new Intent(); data.putExtra("first_name",firstName); data.putExtra("last_name",lastName); data.putExtra("user_name",user_name_search.getText().toString()); data.putExtra("profile", profile_image); setResult(RESULT_OK,data); Log.i("SearchContactActivity", "Set result OK, calling finish()"); finish(); }
4. 额外注意事项
- 如果你使用的是AndroidX,建议替换
startActivityForResult为registerForActivityResult(官方已弃用旧API),避免潜在的兼容性问题。 - 日志清空的问题,可以在Logcat中勾选“Show only selected application”,并确保跟踪的是当前应用进程,或者将日志写入文件进行持久化查看。
内容的提问来源于stack exchange,提问作者M.Ahmed

