如何重新启动Android活动

时间:2009-09-09 03:12:38

标签: android android-activity

如何重新启动Android Activity?我尝试了以下操作,但Activity只是退出。

public static void restartActivity(Activity act){

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

}

22 个答案:

答案 0 :(得分:584)

我做了我的主题切换器:

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

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

更新:正如下面的Ralf指出的那样,Activity.recreate()是API 11及更高版本的发展方向。如果您在API11 +环境中,这是首选。如果您使用的是API 10或更低版本,您仍然可以检查当前版本并调用上面的代码段。 (请不要忘记upvote Ralf的回答!)

答案 1 :(得分:342)

自API级别11(Honeycomb)以来,您可以调用活动的recreate()方法(感谢this回答)。

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

答案 2 :(得分:126)

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

public void reload() {
    Intent intent = getIntent();
    overridePendingTransition(0, 0);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    finish();
    overridePendingTransition(0, 0);
    startActivity(intent);
}

答案 3 :(得分:109)

结合Ralf和Ben的答案(包括评论中的更改):

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);
}

答案 4 :(得分:21)

我使用了此代码,因此我仍然可以支持较旧的Android版本,并在较新的Android版本上使用recreate()

代码:

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());
        }
    }
}

答案 5 :(得分:20)

这个解决方案对我有用。

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

示例代码:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}

答案 6 :(得分:18)

这是目前重启当前活动的最简单方法:

finish();
startActivity(getIntent());

答案 7 :(得分:17)

调用此方法

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

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

谢谢,

答案 8 :(得分: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它只会杀死活动而不会重新启动它。

随时提出任何问题。

干杯, 克里斯

答案 9 :(得分:15)

这不是列出的,而是已经发布的一些组合:

if (Build.VERSION.SDK_INT >= 11) {
    recreate();   
} else {
    Intent intent = getIntent();
    finish();
    startActivity(intent);
}

答案 10 :(得分:4)

如果有人在寻找Kotlin答案,您只需要这一行。

片段

app.component.css

活动

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

答案 11 :(得分:3)

strange SurfaceView lifecycle behaviour with the Camera结合使用。我发现recreate()在SurfaceViews的生命周期中表现不佳。在娱乐周期中,不会调用surfaceDestroyed。它在onResume(奇怪)之后调用,此时我的SurfaceView被销毁。

重新创建活动的原始方式运行良好。

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

我无法确切地知道这是为什么,但这只是一个观察,可以在将来引导其他人,因为它解决了我在SurfaceViews中遇到的问题

答案 12 :(得分:3)

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

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

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

答案 13 :(得分:3)

public void onRestart() {
    super.onRestart();
    Intent intent=new Intent();
    intent.setClass(act, act.getClass());
    finish();
    act.startActivity(intent);
}

尝试使用它..

答案 14 :(得分:3)

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

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
overridePendingTransition(0, 0);

答案 15 :(得分:2)

您的问题的解决方案是:

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

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

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

答案 16 :(得分:1)

如果删除最后一行,您将创建新的act活动,但您的旧实例仍然有效。

您是否需要重新启动活动,例如更改方向时(即您的状态已保存并传递到onCreate(Bundle))?

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

如果您需要保存大部分州,那么您将进入相当深的水域,因为传递您所在州的所有属性是非常重要的,特别是在不泄漏旧的上下文/活动的情况下,将其传递给新的实例

请指出你想做什么。

答案 17 :(得分:0)

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

  

制定可用于重新启动应用程序任务的意图        *处于其基本状态。

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

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

答案 18 :(得分:0)

您可以简单地使用

  

onRestart()

方法如下

 @Override
    protected void onRestart() {
        super.onRestart();
        setContentView(R.layout.add_entry);
    }

调用onRestart()要在其中重新启动当前活动

答案 19 :(得分:0)

这就是我的方法。

git status

答案 20 :(得分:-1)

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

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

答案 21 :(得分:-5)

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