2016-09-30 71 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); 
} 

注:不推薦強行重新啓動應用程序。

相關問題