以编程方式重新启动/重新创建活动?

Pen*_*m10 110 android

在我的数据库中进行一些更改后,我的视图发生了重大变化,我想重新绘制,重新执行onCreate.

怎么可能?

Ste*_*ley 113

更新:Android SDK 11 为活动添加了recreate()方法.

我通过简单地重用启动活动的意图来做到这一点.recreate()在您的班级中定义一个意图并在starterIntent使用中分配它onCreate().然后,当您想要重新启动活动时,请致电starterIntent = getIntent();

它不是一个非常优雅的解决方案,但它是一种重新启动活动并强制重新加载所有内容的简单方法.

  • 实际上我认为当设备方向改变时,活动的oncreate以类似的方式被调用..所以我不介意这样做.startActivity(getIntent()); 完(); (8认同)
  • @Fallenreaper我建议在`startActivity()`之后立即调用`finish()`,正是因为这个原因...... (8认同)
  • 我实现了它首先调用`finish();`然后`startActivity(starterIntent);` (7认同)
  • 那么它是哪个?完成()然后开始活动?或者反过来? (3认同)

Fer*_*her 87

调用活动的重新创建方法.

  • 如果您的应用仅定位到SDK级别11及更高版本,则可以.否则我会选择Steve Haley的方法. (18认同)
  • 在哪里调用重新创建方法 (2认同)

Tim*_*mmm 35

在这里结合一些答案,您可以使用以下内容.

class BaseActivity extends SherlockFragmentActivity
{
    // Backwards compatible recreate().
    @Override
    public void recreate()
    {
        if (android.os.Build.VERSION.SDK_INT >= 11)
        {
            super.recreate();
        }
        else
        {
            startActivity(getIntent());
            finish();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

我测试了一下,有一些问题:

  1. 如果活动是堆栈中的最低活动,则调用startActivity(...); finish();仅存在应用程序并且不会重新启动活动.
  2. super.recreate()实际上并不像完全重新创建活动一样.它相当于旋转设备,所以如果你有任何Fragments,setRetainInstance(true)它们将不会被重建; 只是暂停并恢复.

所以目前我不相信有一个可以接受的解决方案.

  • 替换`startActivity(getIntent()); finish();`到`finish(); startActivity(getIntent());` (6认同)
  • `Build.VERSION.SDK_INT> = Build.VERSION_CODES.HONEYCOMB`而不是使用`11` (5认同)
  • 11是rigth,.HONEYCOMB不对,因为你的代码在SDK <11中不知道wtat是HONEYCOMB. (4认同)

Ayu*_*yal 21

当我需要重新启动活动时,我使用以下代码.虽然不推荐.

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


fla*_*yte 21

选项1

打电话recreate()给你Activity.但是,此方法会在重新创建活动期间出现闪烁的黑屏.

选项2

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

这里没有"闪烁"的黑色屏幕,但你会看到旧的和新的实例之间的过渡,并且有一个不那么令人愉快的黑色背景.我们可以做得更好.

选项3

要解决此问题,我们可以添加一个调用overridePendingTransition():

finish();
startActivity(getIntent());
overridePendingTransition(0, 0);
Run Code Online (Sandbox Code Playgroud)

再见黑屏,但在我的情况下,我仍然会在彩色背景上看到某种过渡(淡入淡出的动画).这是因为您在创建新活动之前完成活动的当前实例并变得完全可见,而中间颜色是windowBackground主题属性的值.

选项4

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

调用finish() 之后 startActivity()将使用活动之间的默认过渡,通常使用一些滑入式动画.但过渡仍然可见.

选项5

startActivity(getIntent());
finish();
overridePendingTransition(0, 0);
Run Code Online (Sandbox Code Playgroud)

对我来说,这是最好的解决方案,因为它重新启动活动而没有任何可见的转换,就像没有发生任何事情一样.

例如,在您的应用程序中,您可以使用一种独立于系统语言更改显示语言的方法.在这种情况下,每当用户更改应用程序的语言时,您可能希望在没有转换的情况下重新启动活动,从而使语言切换看起来很快.


Fra*_*ani 6

对于11之前的API,您无法使用recreate().我这样解决了:

Bundle temp_bundle = new Bundle();
onSaveInstanceState(temp_bundle);
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("bundle", temp_bundle);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)

并在onCreate ..

@Override
public void onCreate(Bundle savedInstanceState) {

    if (getIntent().hasExtra("bundle") && savedInstanceState==null){
        savedInstanceState = getIntent().getExtras().getBundle("bundle");
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //code

}
Run Code Online (Sandbox Code Playgroud)