2016-09-30 99 views
-2

如何,我只是刚刚重新启动我的整个应用程序,而不是试图在的onSaveInstanceState非常担心保存的实例,并重新初始化的是一切都恢复了/在onRestoreInstanceState恢复的时候? (这会很快变得容易出错)重新启动应用程序,而无需担心的onSaveInstanceState

+0

我不确定你的意思是线性规划,但这是一个数学术语 –

回答

0

UPDATE 10.1.16

我选择了做这的onCreate因为onRestoreInstanceState会出现很奇怪的时候。

这种方法是基于这样的事实:所述的onCreate(捆绑)为空,除非活动正在恢复在这种情况下它是任何的onSaveInstanceState(束)将其设置为。

我设置了两个标志。一个在onSaveInstanceState在Bundle中,以便知道它是由我设置的有效Bundle。另一个在课堂本身确定是否onCreate被称为娱乐轮转。所以在的onCreate我检查,看看是否的onSaveInstanceState不为空,检查包标志,检查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 

     ....... 
    } 

希望这可以帮助别人,尽管这一直工作到目前为止,如果任何人有不同的建议让我知道。

,仅供参考:的onSaveInstanceState(捆绑,PersistableBundle)版本的的onSaveInstanceState没有被调用过,所以我不知道为什么他们甚至实现它。

参考(?):

按照Android文档

的onCreate

软件包:如果活动被以前被关闭后重新初始化,则该包中包含的数据是最近在onSaveInstanceState(Bundle)中提供。注意:否则它是空的。

0

如何,我只是刚刚重新启动我的应用程序,而不是试图担心保存实例

你指的是当前的活动?什么也不做(不要执行onSaveInstanceStateonRestoreInstanceState)。

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

编辑:

我想我遇到类似的问题也早几个星期,在那里我已经杀在后面堆中的所有活动,并打开一个全新的活动来了。

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

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

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

+0

否......重新启动整个应用程序,假设我们已经过去了主要(开始)活动。 – zdanman

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); 
} 

注:不推荐强行重新启动应用程序。

相关问题