You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    

    你可以看到SearchContactActivity finish前后的栈变化,确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:03:12