重新启动 Activity 时调用 onStop 延迟

2023-12-06

重新启动 Activity 时,onStop()由于之前的活动延迟太多而无法调用。

我正在使用此代码重新启动我的活动PlayerActivity.java

Intent playerIntent = getIntent();
playerIntent.putExtra(Constants.VIDEO_ID, videoId);
playerIntent.putExtra(Constants.CATEGORY_ID, categoryId);
playerIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(playerIntent);

我们打电话吧上一个玩家活动 and 新玩家活动、之前的活动和新活动。 (记住它们是相同的 PlayerActivity)。

Sequence

重新启动应用程序时,请遵循活动生命周期中的此流程。

PreviousPlayerActivity onPause() --> 
NewPlayerActivity onCreate() --> 
NewPlayerActivity onStart() --> 
NewPlayerActivity onResume() --> 
NewPlayerActivity performs a heavy operation --> 
PreviousPlayerActivity onStop() --> 
PreviousPlayerActivity onDestroy()

我需要的

我需要在 NewPlayerActivity 启动之前完成销毁 PreviousPlayerActivity 。然而,onStop()是在重操作后才调用的,所以延迟了10秒左右才被调用。

我尝试过的

如果我使用recreate()方法,它会在调用 NewPreviousActivity 之前销毁 PreviousPlayerActivity,但是通过调用recreate()我无法将Extras 放入新的活动实例中。

问题

  1. 重启Activity时如何彻底销毁之前的Activity?
  2. 有没有办法在使用时放置Extrasrecreate()?

In 活动生命周期来自 Android 开发者指南。

协调活动

当一项活动启动另一项活动时,它们都会经历生命周期 过渡。第一个 Activity 停止运行并进入 Paused 或已停止状态,同时创建其他活动。万一这些 活动共享保存到光盘或其他地方的数据,这一点很重要 了解第一个活动之前没有完全停止 第二个已创建。相反,启动第二个过程 其中一个与停止第一个的过程重叠。

生命周期回调的顺序是明确定义的,特别是当 这两个活动位于同一进程(应用程序)中,其中一个正在启动 另一个。以下是活动 A 时发生的操作顺序 开始活动 B:

  1. 活动AonPause()方法执行。
  2. 活动BonCreate(), onStart(), and onResume()方法按顺序执行。 (活动 B 现在具有用户焦点。)
  3. 然后,如果 Activity A 在屏幕上不再可见,则其onStop()方法执行。

这种可预测的生命周期回调序列使您能够管理 信息从一项活动转移到另一项活动。

因此,您所描述的行为是预期的或可预测的。

回到你的问题。

1.重启Activity时如何彻底销毁之前的Activity?

  • Using recreate API, 限制是它仅适用于 API 11 或更高版本

2.有没有办法在使用recreate()时放置Extras?

  • From recreate文档

recreate

public void recreate ()

导致使用新实例重新创建此 Activity。这个结果 本质上与由于以下原因创建活动时的流程相同 配置更改——当前实例将经历其 生命周期到 onDestroy() 并在其后创建一个新实例。

因为该活动将被重新创建,所以保存实例状态 and 恢复实例状态也会被调用。正如你可以猜到的,这个想法是将数据保存在onSaveInstanceState并检索到onRestoreInstanceState or onCreate.

第 1 步:将数据保存在onSaveInstanceState

// The key for saving and retrieving isActivityRecreated field.
private static final String KEY_IS_ACTIVITY_RECREATED = "KEY_IS_ACTIVITY_RECREATED";

/** true if this activity is recreated. */
private boolean isActivityRecreated = false;

// Call this method when you want to recreate this activity.
private void recreateActivity() {
    isActivityRecreated = true;
    recreate();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(KEY_IS_ACTIVITY_RECREATED, isActivityRecreated);
    outState.putInt(Constants.VIDEO_ID, videoId);
    outState.putInt(Constants.CATEGORY_ID, categoryId);
}

步骤 2:检索数据onRestoreInstanceState or onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        isActivityRecreated = savedInstanceState.getBoolean(KEY_IS_ACTIVITY_RECREATED);
        if (isActivityRecreated) {
            // This activity has been recreated.
            // Reset the flag
            isActivityRecreated = false;

            // Write your code when this activity recreated.
            int videoId = savedInstanceState.getInt(Constants.VIDEO_ID);
            int categoryId = savedInstanceState.getInt(Constants.CATEGORY_ID);
            ...   
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重新启动 Activity 时调用 onStop 延迟 的相关文章

随机推荐