2014-10-12 1 views
0

У меня есть служба (Foreground, STICKY) и активность (LaunchMode.SingleTask) в том же приложении.mvvmcross app singleton lifecycle

Есть 2 mvvmcross сценарии установки:

  1. служба запускается от загрузки, mvvmcross инициализируется с «setup.EnsureInitialized» методом
  2. служба запускается от деятельности, и mvvmcross инициализровать ' классический 'путь

Иногда из-за низкого давления памяти или неожиданного исключения моя служба убивается или умирает.

я нажимаю тогда на моей пусковой установки

10-13 01:05:06.699 497 507 I ActivityManager: START {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=LoneWorker.Client.Android.App/loneworker.client.android.app.TrialSplashScreen bnds=[240,223][360,379] u=0} from pid 11747 
10-13 01:05:06.769 497 7269 I ActivityManager: Start proc LoneWorker.Client.Android.App for activity LoneWorker.Client.Android.App/loneworker.clientandroid.app.views.HomeView: pid=11980 uid=10081 gids={3003, 1015, 1023, 1028} 

но заставка не появляется, как обычный старт приложения, и приложение не сразу.

10-13 01:05:07.959 11980 11980 I MonoDroid: UNHANDLED EXCEPTION: 
10-13 01:05:07.969 11980 11980 I MonoDroid: System.NullReferenceException: Object reference not set to an instance of an object 
10-13 01:05:07.969 11980 11980 I MonoDroid: at Cirrious.CrossCore.Mvx.Resolve<Cirrious.MvvmCross.Plugins.Messenger.IMvxMessenger>() <0x00038> 
10-13 01:05:07.969 11980 11980 I MonoDroid: at LoneWorker.ClientAndroid.App.Views.HomeView..ctor() <0x0002f> 
10-13 01:05:07.969 11980 11980 I MonoDroid: at (wrapper dynamic-method) object.ee0d83da-1657-4884-bf34-4fc266ad42f0 (intptr,object[]) <0x0003f> 
10-13 01:05:07.969 11980 11980 I MonoDroid: at Java.Interop.TypeManager.n_Activate (intptr,intptr,intptr,intptr,intptr,intptr) <0x00283> 
10-13 01:05:07.969 11980 11980 I MonoDroid: at (wrapper dynamic-method) object.2fd07179-5f93-420a-8653-1fbe1c8a2f2e (intptr,intptr,intptr,intptr,intptr,intptr) <0x0006b> 

В журнале у меня есть только исключение, потому что мессенджер не может быть разрешен контейнером Mvx. => Это невозможно решить просто потому, что процесс установки не запускается. Он ведет себя так, как приложение уже было инициализировано ...

Так что же предыдущий сингл приложения из предыдущего разбитого сервиса все еще где-то?

Могу ли я заставить приложение повторно инициализировать?

Я немного смущен этим странным поведением ...

ответ

1

Трассировка стека показывает, что ваше приложение создается в «новой» процесса, но в настоящее время запущен с помощью HomeView.

Ваш код затем вызывает Mvx.Resolve внутри своего конструктора.

10-13 01:05:07.969 11980 11980 I MonoDroid: at Cirrious.CrossCore.Mvx.Resolve<Cirrious.MvvmCross.Plugins.Messenger.IMvxMessenger>() <0x00038> 
10-13 01:05:07.969 11980 11980 I MonoDroid: at LoneWorker.ClientAndroid.App.Views.HomeView..ctor() <0x0002f> 

Исключение затем вызывается внутри:

public static object Resolve(Type serviceType) 
    { 
     var ioc = MvxSingleton<IMvxIoCProvider>.Instance; 
     return ioc.Resolve(serviceType); 
    } 

Это будет потому, что MvxSingleton<IMvxIoCProvider>.Instance является нулевым (https://github.com/MvvmCross/MvvmCross/blob/3.2/CrossCore/Cirrious.CrossCore/Mvx.cs#L36)

Из жизненного цикла Android, MvvmCross не проверяет, что все настройки выполнены при построении вида - но вместо этого во время метода OnCreate.

Я предлагаю вам перевести свой код из конструктора View и в OnCreate - где-то после вызова base.OnCreate.

Обратите внимание, что в этих ситуациях - если вы используете Setup в потоке пользовательского интерфейса во время создания активности/представления, пользовательский интерфейс может выглядеть «паузой» для пользователей.

+0

yup! вот и все :). Есть, однако, что-то странное: Когда приложение перезагружается после сбоя, оно не проходит через экран Splash, а непосредственно до последнего представления перед сбоем .... – Roubachof

 Смежные вопросы

  • Нет связанных вопросов^_^