@Override
        public boolean handleMessage(Message msg) {

          onBeforeRun(msg.what, (JsonObject) msg.obj);
          switch (msg.what) {
            case ARCHIVE:
              if (archive != null) {
                runArchive();
              }
              break;
            case UPLOAD:
              if (archive != null && upload != null && uploader != null) {
                uploader.run(archive, upload);
              }
              break;
            case UPDATE:
              if (update != null) {
                update.run(name, manager);
              }
              break;
            case DATA:
              String name = ((JsonObject) msg.obj).get("name").getAsString();
              IJsonObject data = (IJsonObject) ((JsonObject) msg.obj).get("value");
              writeData(name, data);
              break;
            default:
              break;
          }
          onAfterRun(msg.what, (JsonObject) msg.obj);
          return false;
        }
  @Override
  public void onDestroy() {

    for (JsonElement dataRequest : data) {
      manager.unrequestData(this, dataRequest);
    }
    for (Map.Entry<String, Schedule> schedule : schedules.entrySet()) {
      manager.unregisterPipelineAction(this, schedule.getKey());
    }
    if (uploader != null) {
      uploader.stop();
    }
    looper.quit();
    enabled = false;
  }
  @Override
  public void onCreate(FunfManager manager) {

    if (archive == null) {
      archive = new DefaultArchive(manager, name);
    }
    if (uploader == null) {
      uploader = new UploadService(manager);
      uploader.start();
    }
    this.manager = manager;
    reloadDbHelper(manager);
    HandlerThread thread = new HandlerThread(getClass().getName());
    thread.start();
    this.looper = thread.getLooper();
    this.handler = new Handler(looper, callback);
    enabled = true;
    for (JsonElement dataRequest : data) {
      manager.requestData(this, dataRequest);
    }
    for (Map.Entry<String, Schedule> schedule : schedules.entrySet()) {
      manager.registerPipelineAction(this, schedule.getKey(), schedule.getValue());
    }
  }