奇怪的重启Android应用程序

时间:2012-10-21 13:01:10

标签: android savestate

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

我们的主要活动是“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,因为视图没有被重建。

为了确保它们不是我添加的Log命令打印出视图当前内容的完整树。 在C语言中的“onSave”之前没有问题,但是在执行“onRestore”之后它就是空的。

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

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

编辑: 我在“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。这是一个普通的Activity,XML具有tabhost,它在代码中设置。

0 个答案:

没有答案