我一直在使用Xamarin的Mono针对Android和MonoCross框架来开发应用程序,这是目前的Android(2.3,4.0等)下运行。 在我的应用程序,我有一个主要活动,在这里用户可以开始新的活动,这又启动其他活动等等。 (例如主 - > A - >乙 - > C)
不时,我获得以下问题:当应用程序被暂停(或停止)一段时间(即没有在前台),和/或其他消耗内存的应用程序已启动,然后我回到我的应用程序,它不是“T正确地重新启动。 这意味着,我可以看到活性C(窗口标题)的部分几秒钟,则C消失,B与A和主要配等。 主营消失后,我回到主屏幕上。 当我重新开始我的应用程序,它的主要活动启动。
在logcat中,我看到这些条目(我希望我没有削减太多):
05-15 14:36:39.732 I/ActivityManager( 598): START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=de.branchare.adwais2013/branchware.adwais.droid.MainActivity u=0} from pid 1349
...
05-15 14:36:39.792 I/ActivityManager( 598): Start proc de.branchare.adwais2013 for activity de.branchare.adwais2013/branchware.adwais.droid.views.ActivityC: pid=29032 uid=10025 gids={3003, 1015, 1028}
...
05-15 14:36:39.952 I/ActivityThread(29032): Pub de.branchare.adwais2013.mono.MonoRuntimeProvider.__mono_init__: mono.MonoRuntimeProvider
...
05-15 14:36:42.966 I/MonoDroid(29032): at MonoCross.Droid.MXDialogActivityView`1<Branchware.Adwais.ModelContainer`1<Branchware.Adwais.Model.Visit>>.OnCreate (Android.OS.Bundle) <0x00053>
05-15 14:36:42.966 I/MonoDroid(29032): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) <0x00057>
05-15 14:36:42.966 I/MonoDroid(29032): at (wrapper dynamic-method) object.15bfff07-188b-4aff-a34f-ab878a2a545f (intptr,intptr,intptr) <0x00043>
05-15 14:36:43.036 E/mono (29032):
05-15 14:36:43.036 E/mono (29032): Unhandled Exception:
05-15 14:36:43.036 E/mono (29032): System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
05-15 14:36:43.036 E/mono (29032): at System.Collections.Generic.Dictionary`2[System.Type,System.Object].get_Item (System.Type key) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 E/mono (29032): at MonoCross.Droid.MXDialogActivityView`1[Branchware.Adwais.ModelContainer`1[Branchware.Adwais.Model.Visit]].OnCreate (Android.OS.Bundle bundle) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 E/mono (29032): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (IntPtr jnienv, IntPtr native__this, IntPtr native_savedInstanceState) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 E/mono (29032): at (wrapper dynamic-method) object:15bfff07-188b-4aff-a34f-ab878a2a545f (intptr,intptr,intptr)
05-15 14:36:43.036 I/mono (29032): [ERROR] FATAL UNHANDLED EXCEPTION: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
05-15 14:36:43.036 I/mono (29032): at System.Collections.Generic.Dictionary`2[System.Type,System.Object].get_Item (System.Type key) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 I/mono (29032): at MonoCross.Droid.MXDialogActivityView`1[Branchware.Adwais.ModelContainer`1[Branchware.Adwais.Model.Visit]].OnCreate (Android.OS.Bundle bundle) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 I/mono (29032): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (IntPtr jnienv, IntPtr native__this, IntPtr native_savedInstanceState) [0x00000] in <filename unknown>:0
05-15 14:36:43.036 I/mono (29032): at (wrapper dynamic-method) object:15bfff07-188b-4aff-a34f-ab878a2a545f (intptr,intptr,intptr)
05-15 14:36:43.136 I/ActivityManager( 598): Recipient 29032
05-15 14:36:43.136 I/ActivityManager( 598): Process de.branchare.adwais2013 (pid 29032) has died.
05-15 14:36:43.136 D/InputManager( 598): setFocusedApplication Exception: java.lang.NullPointerException
...
05-15 14:36:43.136 W/ActivityManager( 598): Force removing ActivityRecord{41cc9df0 de.branchare.adwais2013/branchware.adwais.droid.views.ActivityC}: app died, no saved state
...
05-15 14:36:43.166 I/ActivityManager( 598): Start proc de.branchare.adwais2013 for activity de.branchare.adwais2013/branchware.adwais.droid.views.ActivityB: pid=29052 uid=10025 gids={3003, 1015, 1028}
在我看来,就好像
- Android已经销毁()代管我的活动而遭到暂停(我知道是正确的behavoir)
- 安卓然后尝试创建()的活动的新情况下,当用户返回到我的应用程序(这是正确的,太)
- 在框架的MXDialogActivityView.OnCreate(),MonoCross试图调用render()之前获取来自MXDroidContainer模型:
// fetch the model before rendering!!!
Model = (T)MXDroidContainer.ViewModels[typeof(T)];
// render the model within the view
Render();
- 这就是KeyNotFoundException被抛出(在方法Render()不会被调用),因为MXDroidContainer不包含的ViewModels任何更长的时间。 (也许这种情况下也是在此期间重新创建的,因此不包含任何数据。)
我知道Android可以(甚至是必须)破坏暂停/停止的应用程序。 但它很讨厌看我的应用程序可以追溯到整个活动堆栈,然后完全消失,不必重新重新启动它。
我想实现的是:
一)我的应用程序应该重新启动停止的地方(在活动C)。
如果这是不可能的,那么
B)我的应用程序应该重新启动在MainLauncher(在活动主),完全重新初始化。
我已经阅读(和周围饰)很多关于活动的生命周期,启动模式,AlwaysRetainTaskState,......但我还不找到解决我的问题。
任何帮助或指针将不胜感激。
TIA,曼弗雷德。