当前位置: 首页 > 面试题库 >

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

令狐泓
2023-03-14
问题内容

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

让我们分别调用 PreviousPlayerActivityNewPlayerActivity
,之前的活动以及新的活动。(请记住,它们是相同的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. 使用时有没有办法放置putExtras recreate()

问题答案:

在《Android开发人员指南的活动生命周期》中。

协调活动

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

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

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

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

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

回到您的问题。

1.重启活动时如何彻底销毁PreviousActivity?

  • 使用重新创建 API 的局限性在于它仅适用于API 11或更高版本

2.使用recreate()时是否有方法放置putExtras?

  • 从重新创建文档

重新创建

public void recreate ()

使该活动用新实例重新创建。由于配置更改,这导致与创建Activity时基本上相同的流程-
当前实例将通过其生命周期进入onDestroy(),然后在其之后创建一个新实例。

因为将重新创建活动,所以也会调用onSaveInstanceState和onRestoreInstanceState。正如您可以猜到的想法是保存在数据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步:检索onRestoreInstanceState或中的数据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);
            ...   
        }
    }
}


 类似资料:
  • 我有一个活动,我们称之为FirstActivity.java,它有一个带有通过片段实例化的导航抽屉的actionBar。在这个片段NavigationDrawerFragment.java中,为了实例化ActionBar,我将方法onCreateOptionsMenu(菜单菜单,MenuInflater inflater)、onOptionsItemSelected(MenuItem项)和onPr

  • 我有一个活动需要在启动时打开屏幕(如果关闭)。所以在onCreate中,我有: 使用这个与wakelock在扩频接收器的帮助下,我能够使我的活动显示,每当它从广播接收器开始。 但问题很奇怪,活动生命周期以这种方式调用,onPause()和onResume在开始活动后立即执行 创建时 开始时 继续 打开暂停 onStop(停止) 开始时 继续 所以问题出在启动和恢复调用两次时,停止时也调用,我想在

  • 我正在编写一个使用fire base来实现通知的应用程序。在我的Mainactive中,我有一个带有一些url的WebView,但问题是当用户单击通知时,我想在WebView中使用不同的url打开MainActiviy。我读了很多,我在意图中添加了一个捆绑包(在单击通知时打开Mainactive),它会生成所需的url。但是当我单击通知时,Mainactive会重新启动,我的意思是,它不会转到on

  • 我想在Android上启动另一个活动,但出现以下错误: 请指定构造函数调用;分类器Page2没有伴随对象 实例化类后。我应该怎么做来纠正错误?我的代码:

  • 我有一个应用程序的屏幕小部件。单击此小部件时,会打开“DeveloperMode”设置。但在一些设备上,应用程序因以下消息而崩溃。 引起:android.util.AndroidRuntimeExcture:从活动上下文外部调用starActive()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗? 我曾尝试使用addFlags和setFlags添加这一行,但仍然存在相同

  • 我在清单文件中为我的一个活动定义了一个意图过滤器。当我试图使用以下命令从adb外壳启动此活动时: $adb shell am start 我得到以下错误: 开始:Intent{act=android.Intent.action.VIEW dat=http://www.example.com/gizmospkg=com。实例Android} 错误:活动未启动,无法解析Intent{act=andro