How to hide the black screen while loading scene / load level in the background

When I start my app, I get a temporary 8 seconds black screen right after the splash screen, and after that my heavy scene is loaded. To solve this and after reading other questions- I added an empty Scene0 in order to load the heavy scene in the background. But it didn’t solve the problem- I tried 2 solutions:

 public class Scene0 : MonoBehaviour
{
public string levelName;
AsyncOperation async;

void Start() {
     StartCoroutine("load");
}

IEnumerator load() {
         async = SceneManager.LoadSceneAsync(heavyScene);
     async.allowSceneActivation = false;
     yield return async;
}

public void ActivateScene() {  //Button
     async.allowSceneActivation = true;
}

Result: 4 seconds black screen after the splash screen + 4 seconds black after clicking the button (scene was supposed to be loaded so not sure why black)

  1. Removed void Start() function. And changed the button function to-
public void ActivateScene() {
       StartCoroutine("load");
        async.allowSceneActivation = true;
     }

Result: No black screen after the splash screen (yay). But 8 seconds black screen after clicking the button

The Application.LoadLevel API is deprecated. You should be using the SceneManager class instead (unless you’re still on Unity 5).

Additionally, you’re loading the scene async, but then you’re activating the scene synchronously. You probably want to load the scene additively instead.

Hey sorry, yes I use SceneManager (edited it now).
If I just change it to async = SceneManager.LoadSceneAsync(“heavyScene”,LoadSceneMode.Additive); (in solution 1) The result is 4 seconds black screen after the splash screen + 4 seconds the screen is frozen on Scene0 after button clicked (which is kind of OK for me- better than black), and then errors of “2 audio listeners in scene” (because it seems like Scene0 is not destroyed with additive mode).
This solution still gets the black screen after splash screen and the reason is because I use StartCoroutine(“load”); on Strart()

Try delaying the load by a couple of seconds (yield return new WaitForSeconds( 2f );).