我的Android应用程序中有一个案例,我需要执行一个长时间运行的任务。在该任务结束时,我将使用该信息。我有多个活动需要访问该信息,我不需要每次重新计算它。
简单的答案是创建一个静态的'可以存储信息的类。如果信息尚未存在,则可以启动AsyncTask来获取信息。如果信息已经获得/计算,它可以回馈信息。
但是我想知道在这种情况下服务是否是更好的模式/想法。我可以在Android中使用服务,让该服务获取数据并允许其他活动向该服务请求数据吗?
答案 0 :(得分:1)
但是我想知道在这种情况下服务是否是更好的模式/想法
如果任务花费的时间超过一秒左右,我建议使用IntentService
。这样,如果您的应用在工作进行时移动到后台(例如,来电),Android就不太可能终止您的流程,从而让您完成工作。
如果任务花费的时间超过10-15秒,我建议您使用WakeLock
,也许采用my WakefulIntentService
的形式。否则,设备可能会在工作完成时入睡。
并允许其他活动向该服务询问数据?
您只需要在为用户积极提供价值的同时提供服务。坐在那里等待活动提出问题并没有积极地为用户提供价值。工作完成后,IntentService
会自动销毁。
当数据准备就绪时,使用进程内事件总线(例如,greenrobot的EventBus,Square的Otto,LocalBroadcastManager
)告诉感兴趣的各方数据已准备就绪。如果您还需要保留该点之后的结果,请使用总线的相应功能(例如,带有greenrobot的EventBus的粘性事件,带有Otto的@Producer
模式),或者使用单独的单例缓存。
答案 1 :(得分:0)
如果在应用程序生命周期的不同点需要信息,那么我建议使用共享首选项存储它。这样您就可以选择在下次启动应用程序时访问该信息。
但是,如果您需要通知活动信息的可用性,我会在应用程序中使用一些总线。如果您想使用Otto,请注意它已经停止使用Rx。 a link to Otto's github page