如何重新启动Android Activity
?我尝试了以下操作,但Activity
只是退出。
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
act.startActivity(intent);
act.finish();
}
答案 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);