如何重新启动Android活动

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

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

我做了这样的主题切换:

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

基本上,我打电话给finish()第一,并使用完全相同的意图,这项活动开始。 这似乎是诀窍?

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

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

recreate()方法的作用与配置更改类似,所以如果适用,还会调用onSaveInstanceState()和onRestoreInstanceState()方法。

在SDK 11之前,一种方法是这样的:

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

只要结合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); } 

这个解决方案为我工作。

首先完成活动,然后再次启动。

示例代码:

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

我使用这个代码,所以我仍然可以支持较旧的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()); } } } 

调用这个方法

 private void restartFirstActivity() { Intent i = getApplicationContext().getPackageManager() .getLaunchIntentForPackage(getApplicationContext().getPackageName() ); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity(i); } 

谢谢,

尽管这已经被多次回答了。

如果从一个片段重新开始一个活动,我会这样做:

 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如果你把它叫在一个奇怪的地方,它只会杀死该活动,而不是重新启动它。

随意问任何问题。

干杯,克里斯

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

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

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

 finish(); startActivity(getIntent()); 

实际上下面的代码对于5级以上的API是有效的,所以如果你的目标API比这个低,你最终会得到和EboMike代码非常相似的东西。

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

对于任何活动,包括主要的活动,都有一种可笑的方法。

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

当方向改变时,Android通常会重新创建你的活动(除非你重写)。 当Android不重新创建您的活动时,此方法适用于180度旋转。

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

尝试使用这个..

结合奇怪的SurfaceView生命周期行为与相机 。 我发现recreate()在SurfaceView的生命周期中表现不好。 surfaceDestroyed在娱乐周期中从来没有被称为。 它在onResume(奇怪)之后调用,在这一点上我的SurfaceView被销毁。

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

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

我无法弄清楚这是为什么,但这只是一个观察,希望可以引导其他人在未来,因为它解决了我与SurfaceViews的问题

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

你需要重新启动活动,如方向改变(即你的状态被保存并传递给onCreate(Bundle) )?

如果你不这样做,一个可能的解决方法是使用一个额外的,假的活动,这将从第一个活动开始,以及哪个工作是开始新的实例。 或者只是在新的启动后延迟对act.finish()的调用。

如果你需要保存大部分的状态,那么你将进入相当深的水域,因为通过状态的所有属性,特别是不泄漏旧的上下文/活动,通过将它传递给新的实例是不平凡的。

请指出你想要做什么。

你的问题的解决方案是:

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

您需要投入到活动上下文来启动新的活动,以及完成当前的活动。

希望这有助于…为我工作。

如果你是从一些片段调用,那么下面的代码。

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

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