Как запустить mvvmcross форм IoC в службе заданий Android для использования зарегистрированных служб, когда приложение близко? - PullRequest
0 голосов
/ 16 января 2019

У меня есть служба заданий в моем приложении mvvmcross для Android форм, которое проверяет данные с сервера и создает новое уведомление, если это новое сообщение. Код для проверки новых сообщений находится в эксплуатации, поэтому мне нужно инициализировать mvvmcross IoC, но я получаю ошибку.

 [Service(Exported = true, Permission = "android.permission.BIND_JOB_SERVICE")]
    public class NotificationJobService : JobService
        {
            private static readonly string TAG = "ExampleJobService";

            public override bool OnStartJob(JobParameters args)
            {
                Log.Info(TAG, "on start job: " + args.JobId);

                DoBackgroundWork(args);

                return true;
            }

            public override bool OnStopJob(JobParameters args)
            {
                return true;
            }

            private void DoBackgroundWork(JobParameters args)
            {
                new Thread(() =>
                {
                    var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(ApplicationContext);
                    setupSingleton.EnsureInitialized();

                    Mvx.IoCProvider.Resolve<INotificationService>().ShowNewPostNotification(new Newsfeed());

                    JobFinished(args, true);

                }).Start();
            }     
        }


    [Activity(Label = "SurrenderAt20", MainLauncher = true, Theme = "@style/MainTheme", NoHistory = false, ScreenOrientation = ScreenOrientation.Portrait)]
    public class MainActivity : MvxFormsAppCompatActivity<AndroidSetup, CoreApp, App>
    {

    protected override void OnCreate(Bundle bundle)
    {        
        base.OnCreate(bundle);

        StartJob();
    }

    void StartJob()
    {
        Class javaClass = Class.FromType(typeof(NotificationJobService));
        ComponentName componentName = new ComponentName(this, javaClass);

        JobInfo info = new JobInfo.Builder(123, componentName)
           .SetMinimumLatency(20000)
           .SetOverrideDeadline(25000)
           .SetPersisted(true)
           .Build();


        JobScheduler jobScheduler = (JobScheduler)GetSystemService(JobSchedulerService);
        int result = jobScheduler.Schedule(info);
        if (result == JobScheduler.ResultSuccess)
        {
            Log.Info("MainActivity", "Job Sheduled");
        }
        else
        {
            Log.Info("MainActivity", "Job Filed Sheduled");
        }
    }
}

public sealed class AndroidSetup : MvxFormsAndroidSetup<CoreApp, App>
{       
    protected override void InitializeLastChance()
    {
        Mvx.IoCProvider.RegisterSingleton(typeof(IOperatingSystemService), new OperatingSystemService()); 
        Mvx.IoCProvider.RegisterSingleton(typeof(IMasterDetailService), new MasterDetailService());       
        Mvx.IoCProvider.RegisterSingleton(typeof(INotificationService), new NotificationService());       
        Mvx.IoCProvider.ConstructAndRegisterSingleton<IMvxAppStart, MvxAppStart<RootPageViewModel>>();

        base.InitializeLastChance(); //TODO remove (check if work)
    }
}

MvvmCross.Exceptions.MvxException: не удалось создать экземпляр установки ---> MvvmCross.Exceptions.MvxException: не удалось найти класс установки для приложения в MvvmCross.Core.MvxSetupExtensions.CreateSetup [TSetup] () [0x00019] в <904768743fbc44a983fee28742390539>: 0 в MvvmCross.Core.MvxSetup.Instance () [0x00015] в <904768743fbc44a983fee28742390539>: 0 в MvvmCross.Core.MvxSetupSingleton.CreateSetup () [0x00000] в <904768743fbc44a983fee28742390539>: 0 --- конец внутреннего исключения трассировка стека --- в MvvmCross.Core.MvxSetupSingleton.CreateSetup () [0x00017] в <904768743fbc44a983fee28742390539>: 0 в MvvmCross.Core.MvxSetupSingleton.EnsureSingletonAvailable [TMvxSetupSingleton] () [0x00045] в <904768743fbc44a983fee28742390539>: 0 в MvvmCross.Platforms.Android.Core.MvxAndroidSetupSingleton.EnsureSingletonAvailable (Android.Content.Context applicationContext) [0x00000] в <904768743fbc44a983fee28742390539>: 0 в Surrender_20.Forms.Services.NotificationJobService + <> c__DisplayClass3_0.b__0 () [0x0000b] в <3bf0784f2f454fc395358149cf734980>: 0 в System.Threading.ThreadHelper.ThreadStart_Context (System.Object состояние) [0x00014] в: 0 в System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executeContext, Обратный вызов System.Threading.ContextCallback, состояние System.Object, System.Boolean preserveSyncCtx) [0x00071] в : 0 в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executeContext, Обратный вызов System.Threading.ContextCallback, состояние System.Object, System.Boolean preserveSyncCtx) [0x00000] в : 0 в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executeContext, Обратный вызов System.Threading.ContextCallback, состояние System.Object) [0x0002b] в: 0 в System.Threading.ThreadHelper.ThreadStart () [0x00008] в : 0

1 Ответ

0 голосов
/ 16 января 2019

На вопрос изначально отвечали в комментариях и размещали в качестве ответа в надежде помочь другим.

По договоренности ваш класс установки должен называться "Setup", поэтому вам нужно будет переименовать AndroidSetup в Setup

Справочная информация: глядя на исходный код Mvvmcross , логика инициализации использует отражение и соглашение для инициализации себя. Он ищет класс с именем: «Настройка». В вашем случае MvvmCross не смог найти ваш класс установки и выдал исключение, которое вы прочитали в трассировке стека MvvmCross.Exceptions.MvxException: Could not find a Setup class for application

...