【问题标题】:Reload activity in Android在 Android 中重新加载活动
【发布时间】:2011-03-04 11:36:29
【问题描述】:

Android 中重新加载 Activity 是一种好习惯吗?

最好的方法是什么? this.finish 然后this.startActivity 与活动Intent?

【问题讨论】:

  • 我不是一个经验丰富的 Android 开发者,但重启一个 Activity 听起来设计很糟糕,只能在极端情况下进行。
  • @Hudson 这就是配置更改发生的情况。这是否是好的设计,这完全是另一个讨论。 ;)
  • @Hudson 所以你现在是 5 年经验的开发者:D
  • @PratikButani,我认识你吗? :) 我现在有 8 年的经验,但在 Android 开发方面的经验并不多。
  • 你访问了我知道的个人资料 :P @Hudson

标签: android android-activity


【解决方案1】:

你可以简单地使用

finish();
startActivity(getIntent());

从内部刷新Activity

【讨论】:

  • 如果不能在活动类中调用怎么办?有什么方法可以通过上下文引用来实现吗?
  • @giorgiline - 是的,创建一个您在活动类中定义的接口,并将该接口作为参数传递给您使用它的任何外部类。
  • 哇,没想到会这么容易。
  • 如何处理已经开始的活动?你可以在原来的调用者仍然收到结果的情况下重新启动它吗?
  • finish() 调用后活动将无效,我只是好奇为什么会这样。你能回答我吗?
【解决方案2】:

对于那些不想看到 在 recreate() 之后闪烁方法的人,只需使用

 finish();
 overridePendingTransition(0, 0);
 startActivity(getIntent());
 overridePendingTransition(0, 0);

【讨论】:

  • 太棒了!我想覆盖转换,以便用户不会注意到!
  • 干得好!用户几乎不会注意到重新加载。
  • 这使得应用程序非常流畅。
  • 这会导致我的启动画面暂时显示,有什么方法可以避免这种情况?
【解决方案3】:

这是我在从偏好更改返回后重新加载活动的操作。

@Override
protected void onResume() {

   super.onResume();
   this.onCreate(null);
}

这实质上会导致 Activity 重绘自身。

更新:更好的方法是调用recreate() 方法。这将导致重新创建活动。

【讨论】:

  • 这可能有效,但强烈建议不要显式调用生命周期方法。
  • 如果你走这条路,你应该使用一个单独的 init() 方法来设置所有内容并在 onCreate() 和 onResume() 中调用它,而不是调用 onCreate()。
  • 很好的解决方案,除非在某些情况下当您的生命周期方法用于其他事情时不起作用。例如,我正在访问手机的摄像头,拍摄照片后,屏幕返回到我的活动以将其发布到视图中。通过使用生命周期方法刷新,我被踢出相机进程,我的照片不会返回到活动中,而是从一开始就得到活动。只是一个需要注意的例子。
  • 在使用 recreate() 时考虑 Activity 的 launchMode 很重要。例如,当我在具有 launchMode=singleTop 的活动上调用 recreate() 时,我看不到 onCreate() 之后被调用。 OTOH,如果我没有调用 recreate(),而是显式调用了 finish(),然后是 startActivity(),我确实看到 onCreate() 之后被调用了。
【解决方案4】:

简单地使用

this.recreate();

这会触发activity中的onCreate方法

【讨论】:

  • 迄今为止最好的解决方案!
  • 小心:这不仅会触发onCreate(),还会创建一个全新的Activity实例!
  • 这不会重置整个代码并重新初始化所有值。
【解决方案5】:

我看到了使用 Intent 重新加载活动的早期答案。这些都可以,但你也可以使用 Activity 类本身给出的 recreate() 方法来做同样的事情。

而不是写这个

// 关闭对话框时刷新主活动

Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish();

这可以通过只写这个来完成

recreate();

【讨论】:

  • recreate() 是我的解决方案 - “重新启动”活动对我不起作用,因为我使用“StartActivityForResult”开始活动并且它破坏了行为。
【解决方案6】:

我需要快速更新我的一个应用程序中的消息列表,所以我在关闭我所在的对话框之前刷新了我的主要 UI 活动。我确信有更好的方法来完成这个也是。

// Refresh main activity upon close of dialog box
Intent refresh = new Intent(this, clsMainUIActivity.class);
startActivity(refresh);
this.finish(); //

【讨论】:

    【解决方案7】:

    Android 包含一个进程管理系统,用于处理 Activity 的创建和销毁,这在很大程度上抵消了您从手动重新启动 Activity 中看到的任何好处。您可以在Application Fundamentals查看有关它的更多信息

    但好的做法是确保您的 onPause 和 onStop 方法释放您不需要保留的任何资源,并使用onLowMemory 将您的活动需求减少到绝对最低限度。

    【讨论】:

    • +1 用于提及 onLowMemory。我不知道有这种方法!
    【解决方案8】:

    从同一个activity 的意图开始,然后关闭activity

    Intent refresh = new Intent(this, Main.class);
    startActivity(refresh);//Start the same Activity
    finish(); //finish Activity.
    

    【讨论】:

      【解决方案9】:

      重新加载整个活动可能是一项繁重的任务。 只需将需要刷新的部分代码放入 (kotlin):

      override fun onResume() {
          super.onResume()
          //here...
      }
      

      Java:

      @Override
      public void onResume(){
          super.onResume();
          //here...
      
      }
      

      并在需要时调用“onResume()”。

      【讨论】:

        【解决方案10】:

        在某些情况下,这是最佳实践,在其他情况下,它不是一个好主意,它是上下文驱动的 如果您选择这样做,请使用以下方法将活动传递给她的儿子:

            Intent i = new Intent(myCurrentActivityName.this,activityIWishToRun.class);    
            startActivityForResult(i, GlobalDataStore.STATIC_INTEGER_VALUE);
        

        事情是每当你从activityIWishToRun完成()你回到你的生活活动

        【讨论】:

        • 这可能已经过时了,但你为我节省了很多时间! :)
        【解决方案11】:

        我认为这不是一个好主意...最好实现一个更清洁的方法。例如,如果您的活动包含一个表单,cleaner 方法可以只清除表单中的每个小部件并删除所有临时数据。我想这就是您想要的:将活动恢复到其初始状态。

        【讨论】:

        • 其实我是想改变应用状态,然后重新加载activity来体现变化。
        • 在您的情况下,“应用程序状态”是什么?偏好?
        【解决方案12】:

        在尝试了一段时间后,我没有发现重新启动活动的意外后果。此外,我认为这与 Android 在方向更改时默认执行的操作非常相似,因此我认为没有理由在类似情况下不这样做。

        【讨论】:

        • 相反,我尝试通过重新启动活动来“刷新”我的屏幕。从表面上看,它并没有出现任何问题,我的信息更新了我想要的方式,LogCat 讲述了一个不同的故事。在 LogCat 中,我回到活动的 onCreate 方法,它试图提取首选项。第一次尝试我收到一个空指针异常,然后它再次尝试在 onCreate 中启动并第二次接收到 storedPref。不知道这里发生了什么,但我只是想确定你不只是在看结果,因为所见即所得对我来说不是这样。
        • 您究竟是如何重新启动活动的?
        【解决方案13】:

        我也有同样的问题

        import android.support.v4.content.IntentCompat;
        
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
        

        这段代码对我有用。 安卓 API 17

        【讨论】:

          【解决方案14】:

          在活动中,您可以调用recreate() 来“重新创建”活动(API 11+)

          【讨论】:

            【解决方案15】:

            我用过这个,没有它也能正常工作 finish()

            startActivity(getIntent());
            

            【讨论】:

              【解决方案16】:

              对我来说,它正在工作,它没有创建另一个 Intent,并且在同一 Intent 上加载了新数据。

                  overridePendingTransition(0, 0);
                  finish();
                  overridePendingTransition(0, 0);
                  startActivity(getIntent());
                  overridePendingTransition(0, 0);
              

              【讨论】:

                【解决方案17】:

                我有另一种方法,例如:将我的活动的launchMode 设置为singleTop 并且不调用finish(),只需startActivity(getIntent()) 就可以完成这项工作。您只需要关心onCreate()onNewIntent 中的新数据。使用 Sush 的方式,应用程序可能会像 AMAN SINGH 所说的那样闪烁。但我认为,即使 AMAN SINGH 解决了“眨眼”问题,AMAN SINGH 的方法仍然会创建一个新的活动,这在某种程度上是不必要的。

                这个问题为时已晚,但如果有人在寻找解决方案,这里就是。

                【讨论】:

                  【解决方案18】:

                  登录后我遇到了同样的问题,所以我使用了

                  @Override
                  protected void onRestart() {
                      this.recreate();
                      super.onRestart();
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-06-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多