如何重新启动Android Activity
?我尝试了以下方法,但是Activity
简单地退出了。
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
act.startActivity(intent);
act.finish();
}
如何重新启动Android Activity
?我尝试了以下方法,但是Activity
简单地退出了。
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
act.startActivity(intent);
act.finish();
}
Answers:
我做了这样的主题切换器:
Intent intent = getIntent();
finish();
startActivity(intent);
基本上,我finish()
首先打电话,并且我使用的是与开始此活动完全相同的意图。这似乎可以解决问题?
更新:正如下面的Ralf所指出的那样,这Activity.recreate()
是API 11及其以后版本的方法。如果您使用的是API11 +环境,则更可取。如果您使用的是API 10或更低版本,您仍然可以检查当前版本并调用上面的代码段。(请不要忘记赞扬拉尔夫的答案!)
从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);
}
overridePendingTransition(0, 0);
在after finish()
和之后调用,而startActivity()
不是在您调用它的位置...
只是为了结合拉尔夫和本的答案(包括评论中所做的更改):
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);
}
我使用了这段代码,因此我仍然可以支持较旧的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());
}
}
}
到目前为止,这是重新启动当前活动的最简单方法:
finish();
startActivity(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);
}
});
因此,您可能会认为这有点矫kill过正?但是Handler
发布允许您在生命周期方法中调用它。我在onRestart
/onResume
在检查用户返回应用程序之间的状态是否已更改时,方法中方法。(安装了一些东西)。
没有 Handler
如果您在一个奇怪的地方调用它,它将杀死该活动,而不会重新启动它。
随意问任何问题。
克里斯,干杯
好吧,这没有列出,而是一些已经发布的组合:
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
Intent intent = getIntent();
finish();
startActivity(intent);
}
结合奇怪的SurfaceView生命周期行为与相机。我发现recreate()在SurfaceViews的生命周期中表现不佳。在娱乐周期中从未调用surfaceDestroyed。在onResume(奇怪)之后调用它,这时我的SurfaceView被销毁了。
重新创建活动的原始方法很好用。
Intent intent = getIntent();
finish();
startActivity(intent);
我无法弄清楚为什么会这样,但这只是一个观察,它有望在将来指导其他人,因为它解决了我在SurfaceViews上遇到的问题
有一种适用于任何活动的骇客方式,包括主要活动。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
更改方向后,Android通常会重新创建您的活动(除非您覆盖它)。当Android不重新创建活动时,此方法可用于180度旋转。
您问题的解决方案是:
public static void restartActivity(Activity act){
Intent intent=new Intent();
intent.setClass(act, act.getClass());
((Activity)act).startActivity(intent);
((Activity)act).finish();
}
您需要转换为活动上下文以启动新活动以及完成当前活动。
希望这对我有帮助。
如果删除最后一行,则将创建新的act
Activity,但旧实例仍处于活动状态。
您是否需要像更改方向(例如,保存状态并将状态传递给onCreate(Bundle)
)一样重新启动“活动” ?
如果不这样做,一个可能的解决方法是使用一个额外的虚拟活动,该活动将从第一个活动开始,而哪个工作是启动该活动的新实例。或者只是延迟拨打act.finish()
在新开始后。
如果您需要保存大多数状态,那么您将陷入困境,因为通过将状态的所有属性传递给新实例来传递状态的所有属性并非易事,尤其是在不泄漏旧的Context / Activity的情况下。
请指定您要做什么。
如果要从某个片段调用,请执行以下代码。
Intent intent = getActivity().getIntent();
getActivity().finish();
startActivity(intent);