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

Android开发:如何让onResume仅在Activity第二次进入时执行?

实现思路与代码示例

嘿,这个需求其实很好实现,不用额外的生命周期方法,核心就是加个状态标记来区分首次和非首次进入Resumed状态~我给你分两种常见场景讲清楚:

场景1:Activity未被系统销毁(比如从其他Activity返回)

这种情况最简单,只需要在Activity类里定义一个成员变量来记录是否是首次进入Resumed状态即可:

public class YourActivity extends AppCompatActivity {
    // 标记是否是第一次进入Resumed状态
    private boolean isFirstResume = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        // 这里放你首次进入时需要执行的onCreate专属操作
        initViews();
        loadInitialData();
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!isFirstResume) {
            // 第二次及以后进入Resumed状态时,执行你的特定操作
            refreshContent();
            showWelcomeBackTip();
        } else {
            // 首次进入后,把标记置为false,下次就会触发上面的逻辑
            isFirstResume = false;
        }
    }

    // 示例方法,替换成你自己的业务逻辑
    private void initViews() { /* 初始化视图 */ }
    private void loadInitialData() { /* 加载初始数据 */ }
    private void refreshContent() { /* 刷新内容 */ }
    private void showWelcomeBackTip() { /* 显示返回提示 */ }
}

场景2:考虑Activity被系统销毁重建(比如横竖屏切换、内存不足)

如果你的Activity可能因为系统原因被销毁重建,上面的成员变量会被重置为true,这时候就需要用持久化存储来保存标记状态,比如SharedPreferences:

public class YourActivity extends AppCompatActivity {
    private static final String PREFS_NAME = "YourActivityPrefs";
    private static final String KEY_IS_FIRST_ENTER = "is_first_enter";
    private boolean isFirstResume;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);
        
        // 从SharedPreferences读取首次进入标记
        SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        isFirstResume = prefs.getBoolean(KEY_IS_FIRST_ENTER, true);
        
        // 首次进入时执行onCreate操作,并更新标记
        if (isFirstResume) {
            initViews();
            loadInitialData();
            prefs.edit().putBoolean(KEY_IS_FIRST_ENTER, false).apply();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (!isFirstResume) {
            // 第二次及以后进入Resumed状态时执行特定操作
            refreshContent();
            showWelcomeBackTip();
        }
    }

    // 示例方法,替换成你自己的业务逻辑
    private void initViews() { /* 初始化视图 */ }
    private void loadInitialData() { /* 加载初始数据 */ }
    private void refreshContent() { /* 刷新内容 */ }
    private void showWelcomeBackTip() { /* 显示返回提示 */ }
}

关键说明

  • 核心逻辑就是用标记变量区分首次和非首次进入Resumed状态,不需要额外的生命周期方法,onResume()完全够用。
  • 选择哪种实现取决于你的业务场景:如果Activity不会被频繁销毁重建,第一种简单方案就足够;如果需要应对系统销毁的情况,就用第二种持久化方案。

内容的提问来源于stack exchange,提问作者TheAlmac2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:25:00