react-native-navigation的迁移库

SplashActivity.java 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package com.reactnativenavigation.controllers;
  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.graphics.Color;
  5. import android.os.Bundle;
  6. import android.support.annotation.LayoutRes;
  7. import android.support.annotation.Nullable;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.view.View;
  10. import com.reactnativenavigation.NavigationApplication;
  11. import com.reactnativenavigation.react.*;
  12. import com.reactnativenavigation.utils.CompatUtils;
  13. public abstract class SplashActivity extends AppCompatActivity {
  14. public static boolean isResumed = false;
  15. public static void start(Activity activity) {
  16. Intent intent = activity.getPackageManager().getLaunchIntentForPackage(activity.getPackageName());
  17. if (intent == null) return;
  18. intent.setAction(Intent.ACTION_MAIN);
  19. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  20. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  21. intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
  22. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  23. activity.startActivity(intent);
  24. }
  25. @Override
  26. protected void onCreate(@Nullable Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. LaunchArgs.instance.set(getIntent());
  29. setSplashLayout();
  30. IntentDataHandler.saveIntentData(getIntent());
  31. }
  32. @Override
  33. protected void onResume() {
  34. super.onResume();
  35. isResumed = true;
  36. if (NavigationApplication.instance.getReactGateway().hasStartedCreatingContext()) {
  37. if (CompatUtils.isSplashOpenedOverNavigationActivity(this, getIntent())) {
  38. finish();
  39. return;
  40. }
  41. NavigationApplication.instance.getEventEmitter().sendAppLaunchedEvent();
  42. if (NavigationApplication.instance.clearHostOnActivityDestroy()) {
  43. overridePendingTransition(0, 0);
  44. finish();
  45. }
  46. return;
  47. }
  48. if (ReactDevPermission.shouldAskPermission()) {
  49. ReactDevPermission.askPermission(this);
  50. return;
  51. }
  52. if (NavigationApplication.instance.isReactContextInitialized()) {
  53. NavigationApplication.instance.getEventEmitter().sendAppLaunchedEvent();
  54. return;
  55. }
  56. // TODO I'm starting to think this entire flow is incorrect and should be done in Application
  57. NavigationApplication.instance.startReactContextOnceInBackgroundAndExecuteJS();
  58. }
  59. @Override
  60. protected void onPause() {
  61. super.onPause();
  62. isResumed = false;
  63. }
  64. private void setSplashLayout() {
  65. final int splashLayout = getSplashLayout();
  66. if (splashLayout > 0) {
  67. setContentView(splashLayout);
  68. } else {
  69. setContentView(createSplashLayout());
  70. }
  71. }
  72. /**
  73. * @return xml layout res id
  74. */
  75. @LayoutRes
  76. public int getSplashLayout() {
  77. return 0;
  78. }
  79. /**
  80. * @return the layout you would like to show while react's js context loads
  81. */
  82. public View createSplashLayout() {
  83. View view = new View(this);
  84. view.setBackgroundColor(Color.WHITE);
  85. return view;
  86. }
  87. }