如何重新启动活动在Android

如何重新启动Android Activity?我尝试了以下方法,但Activity简单地退出。

public static void restartActivity(Activity act){


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


}
364905 次浏览

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

你是否需要像方向改变时那样重新启动Activity(即你的状态被保存并传递给onCreate(Bundle))?

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

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

请详细说明你要做什么。

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

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

我的主题切换是这样的:

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

基本上,我首先调用finish(),并且我使用的是这个活动开始时的完全相同的意图。这似乎奏效了?

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

实际上,下面的代码适用于API级别5及以上,所以如果您的目标API低于这个级别,您将得到与EboMike的代码非常相似的代码。

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

调用这个方法

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


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

谢谢,

由于API级别11 (Honeycomb),您可以调用活动的再现()方法(感谢 answer)。

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

尽管这个问题已经被回答了很多次。

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

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方法中使用了这个方法,当检查用户回到应用程序(安装了一些东西)之间的状态是否已经改变时。< / p >

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

请随意提问。

< p >欢呼, 克里斯。< / p >

把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 onRestart() {
super.onRestart();
Intent intent=new Intent();
intent.setClass(act, act.getClass());
finish();
act.startActivity(intent);
}

试着用这个..

有一种俗气的方法适用于任何活动,包括主要活动。

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

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

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

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

奇怪的SurfaceView生命周期行为与相机结合使用。我发现再造()在SurfaceViews的生命周期中表现不佳。在重建周期中,surfaceDestroyed从未被调用。它在onResume (strange)之后被调用,此时我的SurfaceView被销毁。

原来的重新创建活动的方式工作得很好。

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

我不知道这到底是为什么,但这只是一个观察,希望可以指导其他人在未来,因为它解决了我的问题,我有与SurfaceViews

这个解决方案对我很有效。

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

示例代码:

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

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

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

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

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

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

finish();
startActivity(getIntent());

你问题的答案是:

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

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

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

我想知道为什么没有人提到Intent.makeRestartActivityTask(),它清楚地说明了这个确切的目的。

创建一个可以用来重新启动应用程序任务的Intent

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

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

我就是这么做的。

        val i = Intent(context!!, MainActivity::class.java)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i)

如果有人在找科特林的答案你只需要这句话。

片段

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

活动

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