在Android中重新加载活动


220

ActivityAndroid中重新加载,是一种好习惯吗?

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


3
我不是一位经验丰富的Android开发人员,但是重新启动Activity听起来像是糟糕的设计,只应在极端情况下进行。
哈德逊

@Hudson这就是配置更改时发生的情况。如果这不是一个好的设计,那完全是另外一个讨论。;)
hpique 2013年

1
@Hudson所以您现在已有5年的开发人员经验了:D
Pratik Butani

@PratikButani,我认识你吗?:)我现在有8年的经验,但是在Android开发方面经验不多。
哈德逊

您访问了我的档案,我知道:P @Hudson
Pratik Butani

Answers:


521

您可以简单地使用

finish();
startActivity(getIntent());

Activity从自身内部刷新。


2
如果无法在活动类内部调用它,该如何使用上下文引用来实现呢?
giorgiline 2012年

1
@giorgiline-是的,创建一个在活动类内部定义的接口,并将该接口作为参数传递给您正在使用它的任何外部类。
aggregate116​​6877

1
哇,我不认为会那么容易。
theblang 2013年

1
您如何处理已开始取得成果的活动?您可以在原始呼叫者仍然收到结果的情况下重新启动吗?
tothphu 2014年

1
@tothphu-虽然没有尝试,但是理论上我认为是。但是,活动第二次完成时,不会将结果返回给活动首次创建的结果。
2014年

64

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

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

2
太棒了!我想覆盖过渡,以便用户不会注意到!
Ceddy Muhoza

很好!用户几乎不会注意到重新加载。
sam,

38

这是我在更改首选项更改的返回值后重新加载活动的操作。

@Override
protected void onResume() {

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

这实质上导致活动重绘自身。

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


15
这可能有效,但是强烈建议不要显式调用生命周期方法。
ITisha 2014年

如果采用这种方法,则应该使用单独的init()方法进行设置,并从onCreate()和onResume()内部进行调用,而不是调用onCreate()。
2014年

1
很好的解决方案,除非在某些情况下将生命周期方法用于其他用途时不起作用。例如,我正在访问手机的相机,并且在拍照后,屏幕返回到我的活动以将其发布到视图中。通过使用生命周期方法进行刷新,我被踢出了相机过程,并且我的照片没有返回活动,而是从一开始就获得了活动。只是一个需要注意的例子。
Azurespot 2015年

1
使用recreate()时,请务必考虑活动的launchMode。例如,当我在带有launchMode = singleTop的活动上调用recreate()时,看不到之后会调用onCreate()。OTOH,如果我不是调用recreate(),而是显式调用finish(),然后再调用startActivity(),则确实会在之后调用onCreate()。
阿尔伯特·c·布劳恩

14

我看到了使用Intent重新加载活动的较早答案。这些将起作用,但是您也可以使用Activity类本身中提供的recreate()方法来执行相同的操作。

而不是写这个

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

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

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

recreate();

recreate()是我的解决方案-“重新启动”该活动对我而言不起作用,因为我使用“ StartActivityForResult”启动了该活动,因此行为中断了。
KYL3R


10

我需要急忙更新其中一个应用程序中的消息列表,因此在关闭对话框之前,我只是刷新了主要的UI活动。我确信还有更好的方法来完成此操作。

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

9

Android包含一个处理活动创建和销毁的流程管理系统,这在很大程度上抵消了您手动重启活动会看到的任何好处。您可以在“ 应用基础知识”中查看有关它的更多信息。

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


2
+1表示onLowMemory。我不知道这种方法存在!
hpique 2010年

4

从您的意图开始,activity然后关闭activity

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

4

在某些情况下,这是最佳实践,而在其他情况下,则不是一个好主意。如果您选择这样做,则取决于上下文,使用以下内容是从一项活动转移到她的儿子们的最佳方法:

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

事情是每当您从activityIWishToRun完成()


1
这也许很旧,但您却节省了我很多时间!:)
Lior Iluz

4

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

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

Java:

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

}

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


2

我认为这不是一个好主意……实施更简洁的方法会更好。例如,如果您的活动包含一个表单,那么cleaner方法可以仅清除表单中的每个小部件并删除所有临时数据。我想这就是您想要的:将活动还原到其初始状态。


实际上,我想更改应用程序状态,然后重新加载活动以反映更改。
hpique 2010年

您的情况下的“应用程序状态”是什么?优先?
zehrer 2010年

2

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


相反,我尝试通过重新启动活动来“刷新”屏幕。表面上没有出现任何错误,我的信息更新了我想要的方式,LogCat讲述了一个不同的故事。在LogCat中,我回到活动的onCreate方法,它尝试提取首选项。第一次尝试,我收到一个空指针异常,然后它再次尝试从onCreate开始,并第二次接收到storedPref。不知道这里发生了什么,但我只是想确保您不会只是在看结果,因为所见即所得对我而言并非如此。
taraloca

您如何准确地重新开始活动?
hpique 2010年

2

我有同样的问题

import android.support.v4.content.IntentCompat;

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

这段代码对我有用。Android API 17


2

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


1

我有另一种方法,例如:将launchMode活动的设置为singleTop不调用finish(),就startActivity(getIntent())可以完成工作。只需要关心这两个新的数据onCreate()onNewIntent。以Sush的方式,应用程序可能会像AMAN SINGH所说的那样闪烁。但是,我认为即使阿曼·辛格(AMAN SINGH)解决了“眨眼”问题,他的方法仍然会创造出一种新的活动,无论如何,这都是不必要的。

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


0

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

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


0

对我来说,它正在工作,不是在创建另一个Intent,而是在相同的Intents上加载新数据。

    overridePendingTransition(0, 0);
    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.