【问题标题】:Android how to restart an activityAndroid如何重新启动活动
【发布时间】:2014-09-11 10:03:08
【问题描述】:

标记为重复之前小心红色:

我如何重新启动和 android 术语中的活动在活动中。 (就像有人按下主页按钮并返回应用程序一样)。我不想重绘我的活动,所以不能调用onCreate。基本上怎么办pause -> stop -> start -> resume? (没有destroy or create

我想这样做的主要原因是,当我修改窗口标志时,它们不会立即生效,但在按下主页并返回应用程序后它们会生效。任何其他关于确保它们生效的建议都将受到欢迎。 (FLAG_SECURE 是不立即生效的标志)

我找不到任何关于这涉及重绘完整活动的所有其他类似问题的任何信息。

【问题讨论】:

    标签: java android android-activity view


    【解决方案1】:

    当你重新开始你的活动时,还不是很清楚......

    (来自http://developer.android.com/reference/android/app/Activity.html

    正如您所看到的,一旦您的活动停止(在 onStop() 之后),它可以被销毁或重新启动 - 但这取决于超出我们范围的其他活动 - 所以我们不知道您的上下文开始/停止您的活动...

    ->你的

    没有明确的答案

    记住编程提示:

    根据活动的复杂性,您可能不需要实现所有生命周期方法。但是,重要的是您要了解每一项并实施这些以确保您的应用程序按照用户期望的方式运行。正确实施您的活动生命周期方法可确保您的应用在多个方面表现良好,包括:

    • 如果用户在使用您的应用时接到电话或切换到另一个应用,则不会崩溃。
    • 在用户不积极使用时不会消耗宝贵的系统资源。 如果用户离开您的应用并稍后返回,不会丢失用户的进度。
    • 当屏幕在横向和纵向之间旋转时不会崩溃或丢失用户的进度。

    (来自http://developer.android.com/training/basics/activity-lifecycle/starting.html

    可杀

    为了让您更清楚:查看来自http://developer.android.com/reference/android/app/Activity.html 的表格,您可以在其中看到统计数据和可杀标志...

    ...还有那个注释:

    请注意上表中的“Killable”列——对于那些被标记为可杀死的方法,在该方法返回后,托管该活动的进程可能随时被系统杀死,而无需执行另一行代码.因此,您应该使用 onPause() 方法将任何持久性数据(例如用户编辑)写入存储。此外,方法 onSaveInstanceState(Bundle) 在将 Activity 置于此类后台状态之前被调用,允许您将 Activity 中的任何动态实例状态保存到给定的 Bundle 中,以便稍后在 onCreate(Bundle) 中接收该 Activity需要重新创建。有关流程的生命周期如何与其托管的活动相关联的更多信息,请参阅流程生命周期部分。请注意,将持久数据保存在 onPause() 而不是 onSaveInstanceState(Bundle) 中很重要,因为后者不是生命周期回调的一部分,因此不会在其文档中描述的所有情况下都被调用。

    【讨论】:

    • 因此可以使用虚拟活动调用pause -> stop,然后使用虚拟活动导航回原始活动并执行start -> resume
    • 这是可能的,但不能保证防止您的“主要”活动被破坏 - 如果您有一个非常小的移动设备(内存很小的),您的主要活动可能会受到影响也毁了……
    • 在图片中它被描述为“用户导航到活动”并且有两种方法可以导航回您的活动......
    • 如果您导航回您的活动并且您当前的流程需要太多资源,您的原始活动可能已被破坏并且将再次调用 onCreate()!
    • 如果我显示另一个活动,我的一些活动仍然存在 - 有时它们会被杀死 - 我自己对这种行为没有影响,我了解到我总是存储我的活动数据 - 甚至 onPause() 和onResume() (至少我可以在所有生命周期方法中重复使用我的方法 storeData() 和 restoreData())
    【解决方案2】:

    要重新启动活动,您可以这样做:

    Intent intent = getIntent();
    finish();
    startActivity(intent);
    

    【讨论】:

    • OP特别提到他不想重新创建Activity。
    • @VINIL SATRASALA 你的建议不会打电话给onDestroy 然后onCreate 吗?我很确定它确实如此!
    • 我认为Start() 不起作用,因为需要先停止活动。基本上需要调用这个链:pause -> stop -> start -> resume
    • 你试过了吗?我怀疑这会奏效! startActivity(...) 不会被标记为无法访问的代码,但根据我对 Android 的理解,这是无法访问的 :-)
    • 再次 - OP 提到他/她不想销毁或创建 Activity。