代码之家  ›  专栏  ›  技术社区  ›  Soon Santos

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

  •  0
  • Soon Santos  · 技术社区  · 6 年前

    重新启动活动时, onStop() 以前的活动延迟太多,无法调用。

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

    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 onPause() --> 
    NewPlayerActivity onCreate() --> 
    NewPlayerActivity onStart() --> 
    NewPlayerActivity onResume() --> 
    NewPlayerActivity performs a heavy operation --> 
    PreviousPlayerActivity onStop() --> 
    PreviousPlayerActivity onDestroy()
    

    我需要什么

    停止() 在繁重的操作之后才被调用,所以它会延迟大约10秒被调用。

    如果我使用 recreate() 方法在调用NewPreviousActivity之前销毁PreviousPlayerActivity,但是通过调用 我无法向新活动实例中添加额外的内容。

    问题

    1. 有没有办法在使用 重新创建()
    2 回复  |  直到 6 年前
        1
  •  4
  •   Son Truong    6 年前

    Activity Lifecycle 来自Android开发者指南。

    协调活动

    当一个活动开始另一个活动时,它们都经历了生命周期 活动共享保存到光盘或其他地方的数据,重要的是 要明白第一个活动之前并没有完全停止 第二个是创建的。相反,启动第二个 一个与停止第一个的过程重叠。

    生命周期回调的顺序定义得很好,特别是在 这两个活动处于同一进程(app)中,其中一个正在启动 其他的。以下是当活动 开始活动B:

    1. 活动A onPause() 方法执行。
    2. onCreate() onStart() ,和 onResume()
    3. 然后,如果活动A在屏幕上不再可见,则其 onStop() 方法执行。

    这种可预测的生命周期回调序列允许您管理

    所以你描述的行为是预期的或可预测的。

    1.重新启动活动时,如何彻底销毁以前的活动?

    • recreate 应用程序编程接口, 限制是它只能从API 11或更高版本工作

    2.在使用recreate()时,有没有一种方法可以输出额外的内容?

    • 文档

    重新创建

    public void recreate ()
    

    使用新实例重新创建此活动。这个结果 在本质上与由于 配置更改——当前实例将经历 生命周期到onDestroy(),然后在它之后创建一个新实例。

    因为活动会重新创建所以 onSaveInstanceState onRestoreInstanceState onSaveInstanceState 并在 onRestoreInstanceState onCreate .

    OnSaveInstance状态

    // 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:检索中的数据 OnRestoreInstance状态 创建时的回调函数

    @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);
                ...   
            }
        }
    }
    
        2
  •  0
  •   PushpikaWan    6 年前

    只需在中将noHistory标志设置为true即可 AndroidManifest.xml 文件。我认为在根据您的要求最小化时,您不需要保持活动状态。

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