private void setupLocalFileBootLoaderAndRunProject(Runnable pageActivityLauncher) {
   LocalFileBootloader.mShouldExtractAssets = true;
   LocalFileBootloader.setup(
       this,
       pageActivityLauncher,
       new Runnable() {
         @Override
         public void run() {
           Toast.makeText(
                   MonacaSplashActivity.this, "Application launch fail...", Toast.LENGTH_LONG)
               .show();
           finish();
         }
       });
 }
public class MonacaSplashActivity extends Activity {
  private static final String TAG = MonacaSplashActivity.class.getSimpleName();
  protected static final String SPLASH_IMAGE_PATH = "android/splash_default.png";

  /** modify this if want to use LocalFileBootloader */
  @SuppressWarnings("unused")
  public static boolean usesLocalFileBootloader =
      (true && LocalFileBootloader.needToUseLocalFileBootloader());

  protected ImageView splashView;

  protected Handler handler;
  protected Runnable pageLauncher;
  protected MonacaApplication app;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    app = (MonacaApplication) getApplication();
    loadAppJson();
    registerGCM();

    setup();
  }

  protected void setup() {
    Runnable pageActivityLauncher =
        new Runnable() {
          @Override
          public void run() {
            if (hasSplashScreenExists()) {
              splashView = new ImageView(getApplicationContext());
              splashView.setScaleType(ScaleType.FIT_CENTER);
              InputStream stream = getSplashFileStream();
              splashView.setImageBitmap(BitmapFactory.decodeStream(stream));
              splashView.setBackgroundColor(app.getAppJsonSetting().getSplashBackgroundColor());
              try {
                stream.close();
              } catch (Exception e) {
              }
              setContentView(splashView);

              overridePendingTransition(
                  mobi.monaca.framework.psedo.R.anim.monaca_none,
                  mobi.monaca.framework.psedo.R.anim.monaca_slide_close_exit);

              handler = new Handler();
              pageLauncher =
                  new Runnable() {
                    @Override
                    public void run() {
                      Intent intent = createActivityIntent();
                      startActivity(intent);
                      finish();
                    }
                  };

              handler.postDelayed(pageLauncher, 1000);
            } else {
              goNextActivityWithoutSplash();
            }
          }
        };

    if (shouldExtractAsset()) {
      MyLog.v(TAG, "should extract asset!!!!");
      setupLocalFileBootLoaderAndRunProject(pageActivityLauncher);
    } else {
      if (!usesLocalFileBootloader) {
        pageActivityLauncher.run();
        LocalFileBootloader.mShouldExtractAssets = false;
      } else {
        setupLocalFileBootLoaderAndRunProject(pageActivityLauncher);
      }
    }
  }

  private void setupLocalFileBootLoaderAndRunProject(Runnable pageActivityLauncher) {
    LocalFileBootloader.mShouldExtractAssets = true;
    LocalFileBootloader.setup(
        this,
        pageActivityLauncher,
        new Runnable() {
          @Override
          public void run() {
            Toast.makeText(
                    MonacaSplashActivity.this, "Application launch fail...", Toast.LENGTH_LONG)
                .show();
            finish();
          }
        });
  }

  // same as shouldUseLocalFileBootloader but has higher priority
  protected boolean shouldExtractAsset() {
    return app.getAppJsonSetting().shouldExtractAssets();
  }

  protected void loadAppJson() {
    app.loadAppJsonSetting();
  }

  protected void registerGCM() {
    try {
      String senderId = app.getAppJsonSetting().getSenderId();
      // GCM registration process
      GCMRegistrar.checkDevice(this);
      GCMRegistrar.checkManifest(this);
      final String regId = GCMRegistrar.getRegistrationId(this);
      if (regId.equals("")) {
        GCMRegistrar.register(this, senderId);
      } else {
        ((MonacaApplication) getApplication()).sendGCMRegisterIdToAppAPI(regId);
      }

    } catch (Exception e) {
      MyLog.d(TAG, "this device or application does not support GCM");
      e.printStackTrace();
    }
  }

  protected Intent createActivityIntent() {
    Intent intent = new Intent(MonacaSplashActivity.this, MonacaPageActivity.class);

    Intent received = getIntent();
    Bundle bundle = received.getExtras();
    if (received != null && bundle != null) {
      GCMPushDataset pushdata = (GCMPushDataset) bundle.get(GCMPushDataset.KEY);
      if (pushdata != null) {
        intent.putExtra(GCMPushDataset.KEY, pushdata);
      }
    }
    return intent;
  }

  protected void goNextActivityWithoutSplash() {
    Intent intent = createActivityIntent();
    intent.putExtra("launchedWithoutSplash", true);
    startActivity(intent);
    finish();
  }

  protected boolean hasSplashScreenExists() {
    if (app.getAppJsonSetting().getAutoHide() == false) {
      return false;
    }
    try {
      InputStream stream = getResources().getAssets().open(SPLASH_IMAGE_PATH);
      stream.close();
      return true;
    } catch (IOException e) {
      return false;
    }
  }

  @Override
  public void onBackPressed() {
    if (handler != null && pageLauncher != null) {
      handler.removeCallbacks(pageLauncher);
    }
    super.onBackPressed();
  }

  protected InputStream getSplashFileStream() {
    try {
      return getResources().getAssets().open(SPLASH_IMAGE_PATH);
    } catch (IOException e) {
      return null;
    }
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
  }
}