如何重新启动Android活动

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

}
Run Code Online (Sandbox Code Playgroud)

Ebo*_*ike 608

我做了我的主题切换器:

Intent intent = getIntent();
finish();
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

基本上,我finish()先打电话,我正在使用与此活动开始时完全相同的意图.这似乎成功了?

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

  • 这值得投票吗?这不是OP提到的要求.事实上,可能需要它. (36认同)
  • 我觉得你错了.downvote表示错误/错误答案,而upvote表示答案很好.赞成票的数量表明答案与其他答案相比有多好.我可以看到你试图推广你的答案,但你为此目的滥用了系统. (28认同)
  • 好吧,如果您不喜欢动画,可以将其关闭(如您在答案中所示).这本身并没有使我的答案错误,它只是没有显示你可以自由添加的一些额外选项(并且在问题中没有被要求). (9认同)
  • +1 - 这对我很有用,正如你所说,动画是我想要的,所以用户知道它正在重新启动.FWIW,当我提出问题的替代答案时,我规定永远不要低估其他用户的答案,尽管我的答案被淘汰时偶尔会投票(不是说发生在这里,只是我这样做) . (8认同)
  • 抱歉,但是,它很尴尬,看起来很奇怪.别拿个人...... (4认同)
  • EboMike和Ben:你的两个解决方案都回答了OP的问题.仅仅因为"美学"原因而拒绝某人的回答是好的,不是很好.我不鼓励任何人在Stackoverflow这里做这件事...... (4认同)
  • 我从来没有说你的答案是错的,投票不一定意味着错,它不如另一个好.我并没有试图在这里尝试自己的号角,只是说不显示动画从UX的角度提供了更真实的"刷新"体验. (3认同)
  • 好吧,我不想继续与你争论,让我们同意不同意.我认为投票提供了一种排名答案的方法,你不这样做.我们会留下它.你的回答实际上是不错的,它只是看起来很奇怪,因为动画飞进来,我无法想象任何我希望有这种效果的场景.它看起来像你要离开页面,然后回到它. (2认同)
  • 如果之前的活动使用startActivityForResult调用了这个怎么办? (2认同)

Ral*_*alf 357

从API级别11(Honeycomb)开始,您可以调用活动的recreate()方法(感谢这个答案).

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

  • 屏幕的快速闪烁在ll处并不酷 (5认同)
  • 如果之前的活动使用startActivityForResult调用了这个怎么办? (2认同)
  • 这在所有情况下都不起作用.如果在调用recreate()时打开导航抽屉,它将在重新创建时保持打开状态,这意味着它可以保存状态,这可能是不可取的. (2认同)

Ben*_*Ben 129

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

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

  • 这对启动器启动的主要活动不起作用.由于意图上设置了一些标志,您的活动最终会被隐藏.否则它很好用. (8认同)
  • +1即使使用主要活动也适合我.但是,你应该分别在`finish()`和`startActivity()`之后调用`overridePendingTransition(0,0);`,而不是你调用它的地方... (3认同)

Jus*_*ris 110

只是结合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);
}
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案.信不信由你,我仍然支持API 3设备,VERSION.SDK_INT值需要API 4. :) (7认同)

Tho*_*Vos 24

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

码:

public static void restartActivity(Activity activity){
    if (Build.VERSION.SDK_INT >= 11) {
        activity.recreate();
    } else {
        activity.finish();
        activity.startActivity(activity.getIntent());
    }
}
Run Code Online (Sandbox Code Playgroud)

样品:

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 20

这个解决方案对我有用.

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

示例代码:

public void restartActivity(){
    Intent mIntent = getIntent();
    finish();
    startActivity(mIntent);
}
Run Code Online (Sandbox Code Playgroud)


Abh*_*oni 18

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

finish();
startActivity(getIntent());
Run Code Online (Sandbox Code Playgroud)


Nik*_*esh 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);
 }
Run Code Online (Sandbox Code Playgroud)

谢谢,


Chr*_*ins 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);
        }
    });
Run Code Online (Sandbox Code Playgroud)

所以你可能会认为这有点矫枉过正?但是Handler发布允许您在生命周期方法中调用它.在检查用户返回应用程序时状态是否发生变化时,我在onRestart/ onResumemethods中使用了此方法.(装了东西).

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

随意问任何问题.

干杯,克里斯

  • 处理程序的绝佳解决方案和很好的推理/解释。 (2认同)

Cod*_*sed 15

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

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

  • 不确定.好吧,如果你使用的是SDK即> = 11,然后重新创建()应该是比获得意图,整理,然后再次启动速度更快.完成调用运行到onStop的代码并重新创建运行代码,如方向更改......所以它不是那么多. (2认同)

shk*_*der 14

我想知道为什么没有人提到Intent.makeRestartActivityTask()清楚地实现了这一确切目的。

制作一个 Intent,可用于在其基本状态下重新启动应用程序的任务 *。

startActivity(Intent.makeRestartActivityTask(getActivity().getIntent().getComponent()));
Run Code Online (Sandbox Code Playgroud)

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


Var*_*Raj 8

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

分段

startActivity(Intent.makeRestartActivityTask(activity?.intent?.component))
Run Code Online (Sandbox Code Playgroud)

活动

startActivity(Intent.makeRestartActivityTask(this.intent?.component))
Run Code Online (Sandbox Code Playgroud)


Dim*_*rov 1

如果删除最后一行,您将创建新的actActivity,但旧实例仍然存在。

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

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

如果您需要保存大部分状态,那么您就陷入了相当深的困境,因为传递状态的所有属性并非易事,尤其是通过将其传递给新实例而不会泄漏旧的上下文/活动。

请具体说明您想做什么。