重新启动活动时调用onStop延迟

时间:2018-10-29 11:18:32

标签: java android android-activity android-lifecycle

重新启动活动时,先前活动中的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);

让我们调用之前的活动和新的活动 PreviousPlayerActivity NewPlayerActivity 。 (请记住,它们是相同的PlayerActivity)。

序列

重新启动应用程序时,将在activity-lifecycle中遵循此流程。

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. 重新启动活动时如何完全销毁PreviousActivity?
  2. 在使用recreate()时是否有放置putExtras的方法?

2 个答案:

答案 0 :(得分:3)

在Android开发者指南的Activity Lifecycle中。

  

协调活动

     

当一项活动开始另一项活动时,它们都会经历生命周期   过渡。第一个活动停止运行并进入已暂停   或“已停止”状态,同时创建其他活动。如果这些   活动共享保存到光盘或其他位置的数据,   了解在此之前,第一个活动并未完全停止   第二个被创建。而是开始第二个过程   一个与停止第一个重叠的过程重叠。

     

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

     
      
  1. 活动A的 onPause() 方法执行。
  2.   
  3. 活动B的 onCreate() onStart() onResume() 方法是按顺序执行的。 (活动B现在具有用户焦点。)
  4.   
  5. 然后,如果活动A在屏幕上不再可见,则会执行其 onStop() 方法。
  6.   
     

这种可预测的生命周期回调顺序使您可以管理   信息从一种活动到另一种活动的过渡。

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

回到您的问题。

  

1。如何在重新启动活动时完全销毁PreviousActivity?

  • 使用recreate API,限制是它只能在API 11或更高版本上使用
  

2。使用recreate()时是否存在putExtras的方法?

  

重新创建

public void recreate ()
     

使该活动与新实例一起重新创建。结果   基本上与创建活动时的流程相同,这是由于   配置更改-当前实例将经历其   onDestroy()的生命周期,然后在它之后创建一个新实例。

因为将重新创建活动,所以也将调用onSaveInstanceStateonRestoreInstanceState。如您所料,该想法是将数据保存在onSaveInstanceState中并在onRestoreInstanceStateonCreate中进行检索。

第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步:检索onRestoreInstanceStateonCreate中的数据

@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);
            ...   
        }
    }
}

答案 1 :(得分:0)

您只需在AndroidManifest.xml文件中将noHistory标志设置为true即可完成此操作。我认为您可以根据需要将活动状态最小化,而无需保持该活动状态。

<activity
            android:name=".PlayerActivity"
            android:noHistory="true" />