413

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

public static void restartActivity(Activity act){

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

}
4

21 回答 21

658

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

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

基本上,我finish()先打电话,而且我使用的是与此活动开始时完全相同的意图。这似乎可以解决问题?

更新:正如下面 Ralf 所指出的,这Activity.recreate()是 API 11 及更高版本的方法。如果您在 API11+ 环境中,这将是更可取的。如果您使用 API 10 或更低版本,您仍然可以检查当前版本并调用上面的代码片段。(请不要忘记支持拉尔夫的回答!)

于 2010-10-20T04:44:43.670 回答
391

由于 API 级别 11(Honeycomb),您可以调用活动的recreate()方法(感谢这个答案)。

recreate() 方法就像配置更改一样,因此如果适用,还会调用您的 onSaveInstanceState() 和 onRestoreInstanceState() 方法。

于 2012-05-04T17:11:21.403 回答
136

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

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}
于 2010-08-05T23:36:53.940 回答
118

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

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);
}
于 2013-05-09T17:36:20.233 回答
36

我使用了这段代码,所以我仍然可以支持较旧的 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());
        }
    }
}
于 2015-11-04T13:24:18.023 回答
27

这是迄今为止重新启动当前活动的最简单方法:

finish();
startActivity(getIntent());
于 2016-03-01T10:57:59.300 回答
23

这个解决方案对我有用。

首先完成活动,然后重新开始。

示例代码:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}
于 2014-10-02T07:19:23.353 回答
20

调用这个方法

private void restartFirstActivity()
 {
 Intent i = getApplicationContext().getPackageManager()
 .getLaunchIntentForPackage(getApplicationContext().getPackageName() );

 i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );
 startActivity(i);
 }

谢谢,

于 2012-03-23T13:43:52.110 回答
18

我想知道为什么没有人提到Intent.makeRestartActivityTask()哪个明确地提出了这个确切的目的。

制作一个可用于在其基本状态下重新启动应用程序任务的 Intent。

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));

此方法设置Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK为默认标志。

于 2018-09-06T08:09:31.483 回答
16

尽管这已被多次回答。

如果从片段重新启动活动,我会这样做:

new Handler().post(new Runnable() {

         @Override
         public void run()
         {
            Intent intent = getActivity().getIntent();
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
            getActivity().overridePendingTransition(0, 0);
            getActivity().finish();

            getActivity().overridePendingTransition(0, 0);
            startActivity(intent);
        }
    });

所以你可能会认为这有点矫枉过正?但是Handler发布允许您在生命周期方法中调用它。在检查用户返回应用程序之间的状态是否发生变化时,我在onRestart/方法中使用了这个。onResume(安装了一些东西)。

如果没有Handler如果你在一个奇怪的地方调用它,它只会终止活动而不重新启动它。

随意问任何问题。

干杯,克里斯

于 2012-07-25T13:49:31.053 回答
15

好吧,这没有列出,而是一些已经发布的组合:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}
于 2013-07-13T00:22:48.590 回答
10

如果有人在寻找 Kotlin 的答案,你只需要这条线。

分段

startActivity(Intent.makeRestartActivityTask(activity?.intent?.component))

活动

startActivity(Intent.makeRestartActivityTask(this.intent?.component))
于 2020-09-02T08:55:31.170 回答
4

有一种 hacky 方法可以用于任何活动,包括主要活动。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

当方向改变时,Android 通常会重新创建您的活动(除非您覆盖它)。当 Android 不重新创建您的活动时,此方法对于 180 度旋转很有用。

于 2013-06-13T23:53:39.013 回答
4

结合使用Camera 的奇怪 SurfaceView 生命周期行为。我发现 recreate() 在 SurfaceViews 的生命周期中表现不佳。surfaceDestroyed 在娱乐周期中从未被调用过。它在 onResume (奇怪)之后调用,此时我的 SurfaceView 被销毁。

重新创建活动的原始方式工作正常。

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

我无法弄清楚这是为什么,但这只是一个观察结果,希望能在未来指导其他人,因为它解决了我在使用 SurfaceViews 时遇到的问题

于 2014-10-01T04:20:11.817 回答
4

您的问题的解决方案是:

public static void restartActivity(Activity act){
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    ((Activity)act).startActivity(intent);
    ((Activity)act).finish();
}

您需要转换到活动上下文以开始新活动并完成当前活动。

希望这有帮助..对我有用。

于 2017-04-18T12:06:51.727 回答
3

实际上,以下代码对 API 级别 5 及更高级别有效,因此如果您的目标 API 低于此级别,您最终会得到与 EboMike 的代码非常相似的内容。

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);
于 2011-06-20T05:29:25.180 回答
3
public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

尝试使用这个..

于 2013-05-17T12:27:06.773 回答
1

如果您删除最后一行,您将创建新的actActivity,但您的旧实例仍然存在。

您是否需要像方向更改时那样重新启动活动(即您的状态已保存并传递给onCreate(Bundle))?

如果您不这样做,一种可能的解决方法是使用一个额外的虚拟 Activity,该 Activity 将从第一个 Activity 开始,并且哪个作业将启动它的新实例。act.finish()或者只是在新的启动后延迟对 的调用。

如果您需要保存大部分状态,那么您将陷入相当深的困境,因为通过将状态的所有属性传递给新实例来传递状态的所有属性并非易事,尤其是在不泄漏旧的 Context/Activity 的情况下。

请指定您要做什么。

于 2009-09-09T09:10:11.780 回答
-1

如果您从某个片段调用,请执行以下代码。

Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);
于 2015-11-04T10:37:28.323 回答
-1

我就是这样做的。

        val i = Intent(context!!, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
        startActivity(i)
于 2019-09-07T01:18:20.867 回答
-5

调用方法 onCreate。例如onCreate(null);

于 2014-12-15T08:04:01.627 回答