我一直在寻找和阅读,并不喜欢符合我需要的简洁答案,所以希望你们能指出我正确的方向。
我有一个简单的应用程序需要定期检查网络上的结果。阅读时,似乎使用AlarmManager是安排事件发生的最合适方式,而不是后台服务。
主要活动显示了该查询发生时的最新Web查询结果,以及下次重新查询时的结果。
我遇到的问题是我没有意识到BroadcastReceiver是在一个单独的进程中运行的...当接收器更新应用程序的最后查询结果,上次检查时间和下一次检查时间时,它显然没有在应用程序使用的对象副本;-)所以当我打开应用程序时它看起来很陈旧......
我已尝试在StateManager类中使用broadcastrecevier和main活动设置的静态变量,我尝试将StateManager指定为Application子类,并在清单中将其指定为android:name ...似乎最终得到了不同的副本,因此从广播接收器更新的状态不是应用程序看到的状态。
不,我开始明白发生了什么......我很难理解解决问题的最佳方法。
使用SQLLite数据库来保持状态将太麻烦,因为我想存储一个对象图,看起来你还不能这样做(即使SQLLite存储blob,android界面也没有覆盖它然而?)我显然不想在O-R映射上花费数小时。
我'做'当前通过通知管理器发出通知,当网页查询突出显示需求时,这允许我将意图和附加内容传递给应用程序..那部分适合我...但是,当webquery返回一个不需要生成通知的结果,我没有“路径”回到应用程序给它下一个检查时间,我不想“只是为了有办法让应用程序前进将附加内容传递给它。
我想问题的症结在于我想要的, 从broadcastrecevier,到我的应用程序可以在其生存时可以检索的某个地方保留一个对象 要么 让广播接收者在应用程序进程中执行工作(不将应用程序带到前台),以便对活动使用的实例进行任何静态变量更改。
如果最好的办法就是把它写成一个服务,那么就这样吧(如果是这样的话,在我开始编码之前......服务在与应用程序相同的过程中运行,或者我会得到类似的'它不是做单身人员应该做的事情'我在广播收听者身上遇到的问题!)
答案 0 :(得分:0)
似乎我在应用清单的接收器部分指定了android:process=":remote"
。删除它会使警报在应用程序线程中运行,从而解决了问题。