Robospice - 在更改活动时保持spice服务继续运行

时间:2013-11-08 15:20:14

标签: android android-service robospice

我使用RoboSpice库来执行异步任务。从他们的例子中,spice服务在BaseActivity中声明,它从activity的onStart方法开始,并在activity的onStop中停止。一切都很好,但是当我想从互联网下载文件,然后我改为另一个活动时,这个下载任务被取消,因为spice服务已停止。它看起来像:

public abstract class BaseActivity{
  /** The request manager. */
private SpiceManager requestManager = new SpiceManager(RequestService.class);   
  @Override
   protected void onStart() {   
      requestManager.start(this);
      super.onStart();     

   }

  @Override
  protected void onStop() {
    requestManager.shouldStop();
    super.onStop();
  }
} 

所以我想知道是否有任何安全的方法可以让Spice服务继续运行下载任务(此任务不会触及UI),其他任务正常工作(意味着它们可以在停止活动时取消)但它仍然可以尊重活动生活圈。

2 个答案:

答案 0 :(得分:11)

@ R4j,你错过了这一点。当持有spicemanager的活动停止时,请求不会停止。在RS中,请求将具有自己的生命周期,并将在不同的上下文(作为Android服务的spice服务)中执行。

因此,如果你发起请求,那么你的活动就会死亡或被杀死,spice请求会以自己的方式继续下去并继续下载。解析也会发生,最后您的结果将被放置在缓存中。如果有的话。

因此,如果您想在活动A中触发请求并在活动B中获得结果,那么您应该:

  • 像往常一样在活动A中执行请求,按照RS样本
  • B中的
  • ,在启动spiceManager之后(即在super.onStart()之后),做两件事:

    • 使用spiceManager.addListenerIfPending在任何待处理请求中重新插入新活动
    • 使用spiceManager.getDataFromCache获取任何可能已被先前请求放入缓存的结果
  • 或者,如果您想在B本身中重新执行请求,您可以,并且您将很高兴得知如果您使用具有相同缓存键的相同请求类,RS将汇总您的新请求任何待处理的请求。

在RS中,请求由复合密钥标识,复合密钥由“请求结果类”+“请求缓存”组成。此复合键可用于检索挂起的请求以及此请求在缓存中放置的任何结果。

答案 1 :(得分:2)

在应用程序类中对spicemanager实例进行declate,并在activity中访问它以启动后台服务。

public class MyApplication extends Application {

    private static MyApplication instance;
        private SpiceManager spiceManager = new SpiceManager(RequestService.class);

    @Override
    public void onCreate() {
        super.onCreate();
    }


    public SpiceManager getManager()
    {
       return spiceManager;
    }

}

在“活动”中,您可以调用它。请参阅下面的代码。

((MyApplication) getApplicationContext()).getSpiceManager().startService(........);