mad*_*dd0 2 android push-notification mvvmcross
我在我的应用程序中创建了一个服务,用于侦听来自GCM的推送通知.
OnMessage在我测试过的所有场景中都会正确调用服务的方法:app在前台运行,app在后台运行,app不运行.但是,当应用程序未运行时,代码NullReferenceException在尝试解析依赖项时抛出一个Mvx.Resolve.
Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
  at Cirrious.CrossCore.Mvx.Resolve[IRepository] () [0x00000] in <filename unknown>:0 
  at MyApp.Android.Notifications.GcmService+<OnMessage>d__3.MoveNext () [0x00000] in <filename unknown>:0 
Process my.app.droid (pid 7846) has died.
看来,由于应用程序没有运行,Setup该类尚未执行,IoC容器不知道如何解析我的类型.或者,更糟糕的是,该Mvx课程尚未初始化而且根本没有.
我似乎无法在网上找到关于如何解决这个问题的文档.
我运气不好,不得不尝试使用通知中发送的信息启动我的应用程序,只IRepository在应用程序完全启动后才对我执行操作?
或者有没有办法确保Mvx在应用程序关闭时运行的服务被系统激活时正确初始化?当然,这将是更好的选择,因为我可能会在其他后台服务中遇到这种情况,听取互联网访问更改或位置更改.
斯图尔特洛奇的评论让我走上了正确的轨道并帮助我解决了我的问题,但我会自己详细回答这个问题,因为其他人可能会遇到同样的问题.
我在网上的不同文件中没有理解的是,MvvmCross Android应用程序是通过一个初始化的MvxAndroidSetupSingleton.这种类型的方法,据我所知,可以安全地重复调用,以确保单例存在并正确初始化:
var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(context);
setupSingleton.EnsureInitialized();
我所要做的就是在通知服务上收到消息时调用此代码:
protected async override void OnMessage(Context context, Intent intent)
{
    var setupSingleton = MvxAndroidSetupSingleton.EnsureSingletonAvailable(context);
    setupSingleton.EnsureInitialized();
    await MyMobileApp.EnsureDataStoreInitialized();
    var logger = Mvx.Resolve<ILogger>();
    logger.Send(LogLevel.Info, "Notification received");
}
如果应用程序正在运行,它基本上是无操作,但如果应用程序关闭,它将初始化MvvmCross运行Setup类的方法等.
然后我借用了这个概念,并在我的应用程序上实现了一个"Ensure"类型的方法,该方法将执行我通常在启动画面中执行的部分初始化(主要是确保数据存储存在).
初始化后MvxAndroidSetupSingleton,我可以像往常一样解决依赖关系.
| 归档时间: | 
 | 
| 查看次数: | 1727 次 | 
| 最近记录: |