问答中心分类: ANDROID如何在 Android 中重新启动 Activity
0
匿名用户 提问 22分钟 前

如何重启安卓Activity?我尝试了以下方法,但是Activity干脆退出。

public static void restartActivity(Activity act){

        Intent intent=new Intent();
        intent.setClass(act, act.getClass());
        act.startActivity(intent);
        act.finish();

}
Nikhil Dinesh 回复 22分钟 前

活动退出是因为你调用了“act.finish();”创建活动后立即…

Nikhil Dinesh 回复 22分钟 前

过时的方法

Nikhil Dinesh 回复 22分钟 前

利用recreate()用于重新加载或重新启动活动。

20 Answers
0
EboMike 回答 22分钟 前

我做了我的主题切换器是这样的:

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

基本上,我在打电话finish()首先,我使用的是与此活动开始时完全相同的意图。这似乎可以解决问题?
更新:正如下面拉尔夫所指出的,Activity.recreate()是进入 API 11 及更高版本的方法。如果您在 API11+ 环境中,这将是更可取的。如果您使用 API 10 或更低版本,您仍然可以检查当前版本并调用上面的代码片段。 (请不要忘记支持拉尔夫的回答!)

Ben 回复 21分钟 前

这种方法的问题在于它会为活动设置动画,因此它似乎可以滑入和滑出……

EboMike 回复 21分钟 前

好吧,如果您不喜欢动画,可以将其关闭(正如您在回答中所展示的那样)。这本身并没有使我的回答出错,只是没有显示您可以自由添加的一些其他选项(并且问题中没有要求)。

Ben 回复 21分钟 前

我从来没有说过你的回答是错误的,投反对票并不一定意味着错误,它只是不如另一个好。不想在这里自吹自擂,只是说不显示动画从用户体验的角度给出了更真实的“刷新”体验。

EboMike 回复 21分钟 前

我想你弄错了。 downvote 意味着错误/错误的答案,upvote 意味着答案很好。赞成票的数量表明了一个答案与其他答案相比有多好。我可以看到您正在尝试宣传您的答案,但是您为此目的滥用了系统。

Ben 回复 21分钟 前

好吧,我不想继续与您争论,让我们同意不同意。我认为投票提供了一种对答案进行排名的方法,但你没有。我们就这样吧。你的答案实际上是不错的,只是因为动画飞进飞出而看起来很奇怪,我无法想象任何我想要产生这种效果的场景。看起来您要离开该页面,然后又回到该页面。

Michael Bray 回复 21分钟 前

+1 – 这对我很有用,正如你所说,动画是我想要的,所以用户知道它正在重新启动。 FWIW,当我提供问题的替代答案时,我制定了一条规则,永远不要对其他用户的答案投反对票,尽管我偶尔会在我的答案被超越时投赞成票(不是说这里发生过这种情况,只是我这样做了) .

ChuongPham 回复 21分钟 前

EboMike 和 Ben:您的两个解决方案都回答了 OP 的问题。纯粹因为“审美”原因而投票否决某人的答案是不好的。我会劝阻任何人不要在 Stackoverflow 上这样做……

android developer 回复 21分钟 前

如果上一个活动使用 startActivityForResult 调用这个活动怎么办?

Choletski 回复 21分钟 前

有时(在 Android 6.1 上)它给出java.lang.SecurityException: Not allowed to start activity Intent

M.kazem Akhgary 回复 21分钟 前

根据实验,差异是recreate将在开始新活动之前调用 onDestroy。手动启动活动并完成当前活动不会。在手动开始新活动之前,您必须确保所有东西都已关闭。

0
Ralf 回答 21分钟 前

由于 API 级别 11 (Honeycomb),您可以调用重新创建()活动方法(感谢this回答)。
recreate() 方法就像配置更改一样,因此如果适用,还会调用您的 onSaveInstanceState() 和 onRestoreInstanceState() 方法。

android developer 回复 21分钟 前

如果上一个活动使用 startActivityForResult 调用这个活动怎么办?

Edward Falk 回复 21分钟 前

好吧,如果您不需要支持低于 API 11 的任何东西,那么这是正确的答案。

android developer 回复 21分钟 前

@EdwardFalk 在支持库上有什么功能吗?

Chapz 回复 21分钟 前

这并不适用于所有情况。如果您在调用 recreate() 时打开了一个导航抽屉,它将在重新创建时保持打开状态,这意味着它会保存状态,这可能是不可取的。

Kimi Chiu 回复 21分钟 前

我是不希望拯救国家的人。有时人们只是想要一个干净的重启,那么他们应该使用 EboMike 的答案。

0
Ben 回答 21分钟 前

在 SDK 11 之前,执行此操作的方法如下:

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}
Juozas Kontvainis 回复 21分钟 前

在 HTC Desire 上仍然保留动画(至少在 onConfigurationChanged 方法中使用时)。它们并不总是出现,但使用 EboMike 的代码它们也不会总是出现。

Thomas Ahle 回复 21分钟 前

这不适用于启动器启动的主要活动。由于在意图上设置了一些标志,您的活动最终将被隐藏。否则它工作得很好。

Ben 回复 21分钟 前

好点子。有意义,因为它从堆栈中的基本活动调用完成()。

Ashok Goli 回复 21分钟 前

在我们更改 Activity 的主题时调用它似乎可以提高速度(没有动画)

caw 回复 21分钟 前

+1 工作正常,对我来说即使是主要活动。但是,您应该致电overridePendingTransition(0, 0);finish()startActivity(),分别不是你叫它的地方……

Alex Lockwood 回复 21分钟 前

@MarcoW。是正确的,检查文档overridePendingTransition().

android developer 回复 21分钟 前

如果上一个活动使用 startActivityForResult 调用这个活动怎么办?

Ben 回复 21分钟 前

是的,那将无法正常运行。 @Ralf 下面的答案现在是您应该这样做的方式。

0
JustinMorris 回答 21分钟 前

只是结合拉尔夫和本的答案(包括评论中的更改):

if (Build.VERSION.SDK_INT >= 11) {
    recreate();
} else {
    Intent intent = getIntent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);

    startActivity(intent);
    overridePendingTransition(0, 0);
}
Edward Falk 回复 21分钟 前

最好的答案。信不信由你,我仍然支持 API 3 设备,并且 VERSION.SDK_INT 值需要 API 4。:)

0
Thomas Vos 回答 21分钟 前

我使用了这段代码,所以我仍然可以支持旧的 Android 版本并使用recreate()在较新的 Android 版本上。
代码:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}

样本:

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private Activity mActivity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mActivity = MainActivity.this;

        Button button = (Button) findViewById(R.id.restart_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                restartActivity(mActivity);
            }
        });
    }

    public static void restartActivity(Activity activity) {
        if (Build.VERSION.SDK_INT >= 11) {
            activity.recreate();
        } else {
            activity.finish();
            activity.startActivity(activity.getIntent());
        }
    }
}