重新启动应用程序而不必担心onSaveInstanceState

时间:2016-09-30 15:40:41

标签: android application-design object-persistence

如何只是重新启动我的整个应用程序,而不是担心在 onSaveInstanceState 中完美保存实例,并在 onRestoreInstanceState 中恢复/恢复时完全重新初始化所有内容? (这很快就会出错)

3 个答案:

答案 0 :(得分:0)

更新10.1.16

我选择在 onCreate 中执行此操作,因为onRestoreInstanceState有时表现得很奇怪。

此方法基于onCreate( Bundle )为空的事实,除非活动已复活,在这种情况下它是 onSaveInstanceState(Bundle) )将其设置为。

我设置了两个标志。在Bundle中的 onSaveInstanceState 中有一个,所以要知道它是我设置的有效Bundle。另一个在类中,用于确定是否因重新创建轮换而调用 onCreate 。所以在 onCreate 中,我检查了 onSaveInstanceState 是否为空,检查Bundle标志,然后检查 bInit (默认为false)。如果两个标志都为真,则意味着android抛弃并销毁我们的应用程序内存,并确保在线性样式应用程序中再次初始化所有内容的最安全方法是重新启动它并启动开始活动。

public class SomeMiddleActivity extends AppCompatActivity
{
    private static boolean bInit = false; // only way it will be false again is if android cleared our memory and we are recreating

    @Override
    public void onSaveInstanceState(Bundle state)
    {
        // set a flag so that onCreate knows this is valid
        state.putBoolean("StateSaved", true);
        super.onSaveInstanceState(state);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // this must be called first always for some reason
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null)
        {
            if (savedInstanceState.getBoolean("StateSaved", false) && !bInit)
            {
                // we were recreated... start app over
                Intent intent = new Intent(getApplicationContext(), Startup.class);
                startActivity(intent);
                finish();
                return;
            }
        }

        bInit = true; // this will stay true until android has cleared our memory

        .......
    } 

希望这对某人有所帮助,虽然到目前为止一直有效,但如果有人有不同的建议,请告诉我。

和FYI: onSaveInstanceState onSaveInstanceState(Bundle,PersistableBundle)版本永远不会被调用,所以我不知道为什么他们甚至实现它。 (?)

参考文献:

根据ANDROID文档

  

的onCreate

     

Bundle:如果在之前关闭之后重新初始化活动,则此Bundle包含最近在onSaveInstanceState(Bundle)中提供的数据。注意:否则为空。

答案 1 :(得分:0)

  

如何只是重启我的应用而不是担心保存实例

你的意思是当前的活动?什么都不做(不要实施onSaveInstanceStateonRestoreInstanceState)。

当更改发生时,活动会自动创建。如果没有保存的实例状态,则活动不会恢复任何数据。

编辑:

我想我几周之前就遇到过类似的问题,在那里我要杀死后台的所有活动并开启一项全新的活动。

// Start Main Activity
Intent intent = new Intent(this, MainActivity.class);
finishAffinity();
startActivity(intent);

使用finishAffinity()。这适用于> API 16。

当您终止后台堆栈中的所有活动并打开主要活动时,它有点类似于重新启动您的应用。

答案 2 :(得分:0)

尝试以这种方式实施

private final String IS_RE_CREATED = "is_re_created";

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(IS_RE_CREATED, true);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if (savedInstanceState.containsKey(IS_RE_CREATED)) {
        boolean isRecreated = savedInstanceState.getBoolean(IS_RE_CREATED, false);
        if (isRecreated) restartApplication(this);
    }
}

public void restartApplication(Context context) {

    String packageName = context.getPackageName();
    PackageManager packageManager = context.getPackageManager();

    // Intent to start launcher activity and closing all previous ones
    Intent restartIntent = packageManager.getLaunchIntentForPackage(packageName);
    restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    restartIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    context.startActivity(restartIntent);

    // Kill Current Process
    Process.killProcess(Process.myPid());
    System.exit(0);
}

注意:建议不要强行重启应用程序。