2

可能是我误解了它应该如何工作,但发生了一些奇怪的事情。

我们的主要活动是“MainMenuActivity”,我们称之为子菜单。用户从那里选择一个选项并获取一些数据,然后可以放大该数据。

如此有效地,我们有一个 A -> B -> C -> D 链

然后我通过拨打电话强制应用程序完成。logcat 清楚地表明应用程序死了。然后,当它重新启动时,我会在活动上超时。这就是 logcat 的样子:

    10-21 14:42:06.018: I/ActivityManager(1156): Starting: Intent { cmp=com.applicat.meuchedet/.MenuScreenActivity (has extras) } from pid 22170
10-21 14:42:06.558: I/ActivityManager(1156): Displayed com.applicat.meuchedet/.MenuScreenActivity: +469ms
10-21 14:42:10.728: I/ActivityManager(1156): Starting: Intent { cmp=com.applicat.meuchedet/.PrescriptionsListScreen } from pid 22170
10-21 14:42:11.368: I/ActivityManager(1156): Displayed com.applicat.meuchedet/.PrescriptionsListScreen: +591ms
10-21 14:42:26.068: I/ActivityManager(1156): Starting: Intent { cmp=com.applicat.meuchedet/.MedicinePurchasesListScreen (has extras) } from pid 22170
10-21 14:42:26.758: I/ActivityManager(1156): Displayed com.applicat.meuchedet/.MedicinePurchasesListScreen: +624ms
10-21 14:43:11.288: I/ActivityManager(1156): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.applicat.meuchedet/.MainActivity bnds=[242,271][358,389] } from pid 21281
10-21 14:43:42.288: I/ActivityManager(1156): Process com.applicat.meuchedet (pid 22170) has died.
10-21 14:43:56.948: I/ActivityManager(1156): Start proc com.applicat.meuchedet for activity com.applicat.meuchedet/.MedicinePurchasesListScreen: pid=22483 uid=10106 gids={3003}
10-21 14:43:58.188: W/ActivityManager(1156):   Force finishing activity com.applicat.meuchedet/.MedicinePurchasesListScreen
10-21 14:43:58.698: W/ActivityManager(1156): Activity pause timeout for HistoryRecord{40553fb8 com.applicat.meuchedet/.MedicinePurchasesListScreen}
10-21 14:44:07.308: W/ActivityManager(1156): Activity idle timeout for HistoryRecord{40553fb8 com.applicat.meuchedet/.MedicinePurchasesListScreen}
10-21 14:44:08.708: W/ActivityManager(1156): Activity idle timeout for HistoryRecord{409a4ad8 com.applicat.meuchedet/.PrescriptionsListScreen}

MenuScreenActivity 是上面描述的“B”。PrescriptionsListScreen 是“C”。MedicinePurchasesListScreen 是“D”。

我在 D 中添加了 Log 命令,但它没有到达那里的“onSaveInstanceState”和“onRestoreInstanceState”方法。

它似乎确实回到了“C”并进入了它的“onRestore”,但捆绑中有垃圾。视图结构未重建。

我在“C”中得到一个 NullPointerException,因为视图没有被重建。

为了确保它们不是我添加了打印出视图当前内容的完整树的日志命令。在 C 中的“onSave”之前它是可以的,但在执行“onRestore”之后它是空的。

我肯定会打电话给“onSave”和“onRestore”中的“super”。

============================================

编辑:我在“onSaveInstanceState”末尾和“onRestoreInstanceState”开头记录了savedInstance的内容。

这就是我得到的。

节省:

onSaveInstanceState -    Bundle = Bundle[{android:viewHierarchyState=Bundle[{android:views=android.util.SparseArray@40730568}], SavedData=com.applicat.meuchedet.MedicinePurchasesListScreen$MedicinePurchasesListScreen_SaveData@407c4ae0}]. contents = [android:viewHierarchyState, SavedData]

恢复:

onRestoreInstanceState - Bundle = Bundle[{android:viewHierarchyState=Bundle[mParcelledData.dataSize=5368], SavedData=com.applicat.meuchedet.PrescriptionsListScreen$PrescriptionsListScreen_SaveData@40563c60}]. contents = [android:viewHierarchyState, SavedData]

可以看出,“viewHierarchyState”包是不一样的。但是,在其他可以正常工作的屏幕中。

这个和其他屏幕唯一的区别就是这里的屏幕内容是一个TabHost。但是,这不是 TabActivity。这是一个普通的活动,带有标签主机的 XML 并在代码中设置。

4

0 回答 0