Сохранение SplashScreen до тех пор, пока react native bundle не будет загружен в android

я следовал руководству android в этой статье Как добавить заставку в родное приложение React

и дошел до того, что у меня есть моя активность SplashScreen перед моей основной деятельностью, т. е. в то время как android-приложение раздувается.

до сих пор так хорошо, но есть мерцание белого цвета, вызванное реакцией родной загрузки JS bundle, которую я хотел бы удалить. Статья предлагает использовать react-native-splash-screen библиотека, однако я хотел бы сохранить свои зависимости в минимальный.

React native documentation имеет это Pro Tip это по существу достигает того, что я ищу, но в iOS (он продолжает показывать заставку, пока пакет не загружен). Я пытаюсь понять, как я бы сделал что-то подобное в родной java для android, но пока не повезло.

2 ответов


вот способ сделать это, когда контент добавляется React:

=== MainActivity.java ===

import com.facebook.react.*;
import android.content.Context;
import android.app.Activity;
import android.util.Log;
import android.view.View;

public class MainActivity extends ReactActivity {
    class CustomReactActivityDelegate extends ReactActivityDelegate {
        class CustomReactRootView extends ReactRootView {
            public CustomReactRootView(Context context) {
                super(context);
            }
            @Override
            public void onViewAdded(View child) {
                 super.onViewAdded(child);
                 Log.d("React views started to appear", "Static js code has already run");
            }
        }
        private Activity currentActivity;
        public CustomReactActivityDelegate(Activity activity, String mainComponentName) {
            super(activity, mainComponentName);
            currentActivity = activity;
        }
        protected ReactRootView createRootView() {
            return new CustomReactRootView(currentActivity);
        }
    }
    @Override
    protected ReactActivityDelegate createReactActivityDelegate() {
        return new CustomReactActivityDelegate(this, getMainComponentName());
    }
    ...
}

как вы можете видеть, идея состоит в том, чтобы переопределить материал, чтобы зацепиться за нужный момент.

вы могли видеть другие вещи для подключения в этих классах, но в целом реагируют нагрузки связки асинхронно с функциями jni, поэтому я не уверен, что там много делать. Вы можете переопределить цепочку

  1. MainApplication (назначить mReactNativeHost) ->
  2. ReactNativeHost.createReactInstanceManager (скопируйте исходный метод, но звоните ReactInstanceManagerBuilder.setJSBundleLoader) ->
  3. JSBundleLoader (wrap original JSBundleLoader.createAssetLoader в пользовательский подкласс, который будет вызывать внутренний загрузчик в loadScript а затем также вызов CatalystInstanceImpl.callFunction) ->
  4. CatalystInstanceImpl.PendingJSCall просто запустить то, что вам нужно, чтобы работать там.

другими словами, это ужасно и до сих пор реагировать не гарантирует, что PendingJSCall не будет запускаться до загрузки пакета.


использовать rn-splash-scren. Когда ваш компонент react загружается, просто вызовите

импорт SplashScreen из "RN-splash-screen";

// скрыть активный заставку

SplashScreen.hide();

вам нужно настроить его с родной стороны, но это легко.