2011-01-27 160 views
0

在我的代碼中,我開始了街景的新活動。主要應用程序在啓動街景活動後死亡

Intent streetView = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(uri)); 
startActivity(streetView); 

它啓動街景就好了。如果我沒有做太多的事情,我可以點擊後退按鈕,我的應用程序就坐在那裏等待沒有任何變化。

不過,如果我使用街景視圖了一下,環顧四周並移動的看法,我看到這個在logcat中:

10月1日至27日:53:27.526:信息/ ActivityManager(1079):低內存:沒有更多的後臺進程。

10月1日至27日:53:27.636:DEBUG/dalvikvm(32218):GC_FOR_MALLOC釋放在655ms

10月1日至27日3054級的對象/ 198608字節:53:27.831:DEBUG/dalvikvm(32164):GC_FOR_MALLOC釋放1054級的對象/在342ms

十月1日至27日51664字節:53:27.862:INFO/dalvikvm堆(32164):生長堆(FRAG情況下),以用於3.656MB 87396字節分配

01- 27 10:53:27.878:INFO/ActivityManager(1079):進程com.favorite.me(pid 32135)已經死亡。

10月1日至27日:53:27.878:INFO/ActivityManager(1079):內存不足:沒有更多的後臺進程。

10月1日至27日:53:27.482:INFO/ActivityManager(1079):進程com.myapp.app(PID 31481)已經死亡。

10月1日至27日:53:27.490:INFO /窗口管理(1079):WIN死亡:窗口{44c68ba8 com.myapp.app/com.myapp.app.MyLocation暫停= FALSE}

然後,當我點擊後退按鈕返回到我的應用程序,似乎所有的變量已被重置爲空,就像我失去了我的應用程序的狀態。解決問題的唯一方法是再次點擊後退按鈕並重新啓動該活動。

從我可以告訴,它不是調用的onPause()或的onSaveInstanceState()方法和OS是殺死我的應用程序的內存來運行街景。

有什麼我需要做不同?

這裏是我的OnCreate,onRestoreInstanceState的onSaveInstanceState和方法:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

 @Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     sLong = savedInstanceState.getDouble("sLong"); 
     sLat = savedInstanceState.getDouble("sLat"); 
     sMapStyle = savedInstanceState.getBoolean("sMapStyle"); 
     sMapUpdate = savedInstanceState.getBoolean("sMapUpdate"); 
     sMapStreet = savedInstanceState.getBoolean("sMapStreet"); 
     sFirstTime = savedInstanceState.getBoolean("sFirstTime"); 
     locationAvailable = savedInstanceState.getBoolean("locationAvailable"); 
     sGPSFlag = savedInstanceState.getBoolean("sGPSFlag"); 
     sMessage = savedInstanceState.getString("sMessage"); 
     sMap = savedInstanceState.getString("sMap"); 
     sGPS = savedInstanceState.getString("sGPS"); 
     sAddressIn = savedInstanceState.getString("sAddressIn"); 
     sGPSLat = savedInstanceState.getString("sGPSLat"); 
     sGPSLong = savedInstanceState.getString("sGPSLong"); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedInstanceState) { 
     super.onSaveInstanceState(savedInstanceState); 
     savedInstanceState.putDouble("sLong",sLong); 
     savedInstanceState.putDouble("sLat",sLat); 
     savedInstanceState.putBoolean("sMapStyle",sMapStyle); 
     savedInstanceState.putBoolean("sMapUpdate",sMapUpdate); 
     savedInstanceState.putBoolean("sMapStreet",sMapStreet); 
     savedInstanceState.putBoolean("sFirstTime",sFirstTime); 
     savedInstanceState.putBoolean("locationAvailable",locationAvailable); 
     savedInstanceState.putBoolean("sGPSFlag",sGPSFlag); 
     savedInstanceState.putString("sMessage",sMessage); 
     savedInstanceState.putString("sMap",sMap); 
     savedInstanceState.putString("sGPS",sGPS); 
     savedInstanceState.putString("sAddressIn",sAddressIn); 
     savedInstanceState.putString("sGPSLat",sGPSLat); 
     savedInstanceState.putString("sGPSLong",sGPSLong); 
    } 

我想我可能對爲什麼會這樣領先。仍然不確定它有多正確。 我設置了一些調試消息,我看到onRestoreInstanceState()onSaveInstanceState()方法運行。

問題是,它不會將我保存的實例恢復到之後我的onCreate()方法結束。但是在onCreate()方法中,我需要這些變量在這個時候仍然是空的。如何讓我的代碼在onCreate()之後運行,但不需要任何用戶輸入?或者我怎樣才能在我的代碼之前運行onRestoreInstanceState()

+0

你怎麼知道'onpause()`和`onSaveInstanceState()`沒有被調用?你是否試圖在這些方法中的一個(或兩個)中保存你的狀態?你記錄了他們的電話嗎? – 2011-01-27 16:34:31

+0

從logcat中告訴我暫停= false。所以它看起來不像它的運行onpause()。另外我把我試圖保存在我的onSaveInstanceState()方法中的變量。 – Brian 2011-01-27 17:39:41

回答

2

你可能無法正確使用onSaveInstanceState

  1. 確保你寫的,代表你的應用程序的狀態到包變量傳遞給你的onSaveInstanceState

  2. 在你活動的onCreate,使用給定的包來恢復你的狀態。或者,您可以在onRestoreInstanceState中執行此操作。

請參閱this stackoverflow問題的完整示例。

1

如果您的應用被殺死,以騰出資源,那麼就沒有什麼可以做,以防止它,甚至保存實例數據被殺害之前。

看看Android開發站點上的Saving Persistent State。他們認爲,可能有必要更積極地節省您的實例狀態 - 這將防止當你的應用程序是由Android殺死失去狀態:

你可能會想提交您的 數據更積極地在關鍵 您的活動的 生命週期中的時間:開始 一個新的活動,完成你自己的 活動,當用戶切換輸入字段之間 前等

之前舉例而言,所有我可以建議是,你明確SA在啓動街景活動之前查看您的實例狀態。

如果這無助於您的實例狀態在您的onCreate中爲null,並且您確定它已正確保存,那麼您可能需要在onCreate中的其餘代碼之前恢復實例狀態。

對於onRestoreInstanceState:

當活動正在從 重新初始化以前保存 狀態這種方法是在onStart() 之後調用,因爲

也是從相同的鏈接注意這裏在 savedInstanceState。

現在在onStart:

的onCreate(捆綁)後調用 - onRestart後或 ()當活動 已經停了,但現在又 被顯示給用戶。

所以,你不能從onRestoreInstanceState中恢復onCreate所需的任何狀態 - 你必須在onCreate中執行此操作。

0

的onSaveInstanceState在功能「super.onSaveInstanceState」應該是在年底。

相關問題