title: admob interstitial callback events only work once and not the second time
body: <p>i made a simple setup. i have a main menu scene having a play button.  </p>
  
  <p>when i press it, it shows an interstitial ad and when i close the ad, the callback events get fired correctly and the gameplay scene starts. 
  now when i loses, the game gets over and game over scene starts which have a replay button.</p>
  
  <p>when i press the replay button, again an interstitial ad is shown, but when i close the ad, no callback events are fired and i remain on the game over scene.  </p>
  
  <p>if i press the reply button again, then nothing happens, not even the ad shows up. I have used dontdestroyonload on my admanager script.  </p>
  
  <p>How do i make the callback events fire every time the ad displays ?<br>
  Am i doing something wrong ?<br>
  Is there any better way of coding an admob admanager script ?</p>
  
  <pre><code> using System.Collections;
   using System.Collections.Generic;
   using UnityEngine;
   using System;
   using GoogleMobileAds.Api;
   using UnityEngine.SceneManagement;
   using TMPro;
  
  
   public class AdManager : MonoBehaviour
   {
       private BannerView bannerView;
       private InterstitialAd interstitial;
       private RewardedAd rewardAd;
       public static AdManager instance;
       //public TextMeshProUGUI testText;
       //bool adClosed = false;
       int bannerAdStatus = 0;
       int interstitialAdStatus = 0;
       int rewardAdStatus = 0;
       //bool destroyObject = false;
       float retryInterval = 1f;
       float initTime;
       bool mBound = false;
       //bool adFailed = false;
  
       public void Awake()
       {
           Debug.Log("AdManager..Awake");
           Debug.Log("AdManager.instance = "+ GetInstanceID());
  
  
           if (instance == null)
           {
               Debug.Log("AdManager..Awake..if" + GetInstanceID());
  
               instance = this;
               DontDestroyOnLoad(gameObject);
           }
           else
           {
               if (instance != this)
               {
                   Debug.Log("AdManager..Awake..else" + GetInstanceID());
  
                   Debug.Log("More than one AdManager in scene");
                   Destroy(this.gameObject);
                   return;
               }
           }
           Debug.Log("AdManager.instance = " + GetInstanceID());
  
  
           /*if (instance == null)
           {
               instance = this;
           }*/
           // Initialize the Google Mobile Ads SDK.
           MobileAds.Initialize(initStatus =&gt; { });
  
           RequestAd();
  
       }
  
       void RequestAd()
       {
           Debug.Log("AdManager..RequestAd" + GetInstanceID());
  
           this.RequestBanner();
           this.RequestInterstitial();
           this.RequestRewardAd();
       }
  
       private void Update()
       {
           switch (bannerAdStatus)
           {
               case 0:
                   break;
               case 1:
                   break;
  
               case 2:
                   if (Time.time - initTime &gt;= retryInterval)
                   {
                       RequestBanner();
                   }
                   break;
  
               case 3:
                   break;
  
               case 4:
                   //MainMenuUI.Play();
                   bannerAdStatus = 0;
                   RequestBanner();
                   break;
  
               case 5:
                   break;
  
  
  
               default:
                   break;
           }
           switch (interstitialAdStatus)
           {
               case 0:
                   break;
               case 1:
                   break;
  
               case 2:
                   if (Time.time - initTime &gt;= retryInterval)
                   {
                       RequestInterstitial();
                   }
                   break;
  
               case 3:
                   break;
  
               case 4:                
                   interstitialAdStatus = 0;
                   RequestInterstitial();
                   SceneManager.LoadScene(SceneIndexer.Gameplay);
                   break;
  
               case 5:
                   break;
  
  
  
               default:
                   break;
           }
           switch (rewardAdStatus)
           {
               case 0:
                   break;
               case 1:
                   break;
  
               case 2:
               case 4:
                   if (Time.time - initTime &gt;= retryInterval)
                   {
                       RequestRewardAd();
                   }                
                   break;
  
               case 3:
                   break;
  
               case 5:
                   rewardAdStatus = 0;
                   RequestRewardAd();
                   break;
  
               case 6:
                   break;
  
  
               default:
                   break;
           }
  
       }
  
       private void Start()
       {
           Debug.Log("AdManager..Start");
           Debug.Log("AdManager..Start..mBound = " + mBound + GetInstanceID());
           if (!mBound)
           {
               mBound = true;
               HandleBannerAdEvents(true);
               HandleInterstitialAdEvents(true);
               HandleRewardAdEvents(true);
           }
  
       }
  
       private void OnDestroy()
       {
           Debug.Log("AdManager..OnDestroy");
           Debug.Log("AdManager..OnDestroy..mBound = "+ mBound + GetInstanceID());
           interstitial.Destroy();
  
           if (mBound)
           {
               mBound = false;
               HandleBannerAdEvents(false);
               HandleInterstitialAdEvents(false);
               HandleRewardAdEvents(false);
           }
  
       }
  
       #region BannerAd
       private void RequestBanner()
       {
           Debug.Log("AdManager..RequestBanner" + GetInstanceID());
  
   #if UNITY_EDITOR
           string adUnitId = "unused";
   #elif UNITY_ANDROID
               string adUnitId = "ca-app-pub-3940256099942544/6300978111";
   #elif UNITY_IPHONE
               string adUnitId = "ca-app-pub-3212738706492790/5381898163";
   #else
               string adUnitId = "unexpected_platform";
   #endif
  
           // Clean up banner ad before creating a new one.
           if (this.bannerView != null)
           {
               Debug.Log("AdManager..RequestBanner..if" + GetInstanceID());
  
               this.bannerView.Destroy();
           }
  
           AdSize adaptiveSize =
                   AdSize.GetCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(AdSize.FullWidth);
  
           this.bannerView = new BannerView(adUnitId, adaptiveSize, AdPosition.Bottom);
  
  
  
           /*AdRequest adRequest = new AdRequest.Builder()
               .AddTestDevice(AdRequest.TestDeviceSimulator)
               .AddTestDevice("0123456789ABCDEF0123456789ABCDEF")
               .Build();*/
  
           AdRequest adRequest = new AdRequest.Builder().Build();
  
           // Load a banner ad.
           this.bannerView.LoadAd(adRequest);
       }
  
       public void DisplayBanner()
       {
           Debug.Log("AdManager..DisplayBanner" + GetInstanceID());
  
           bannerView.Show();
       }
  
       public void HideBanner()
       {
           Debug.Log("AdManager..HideBanner" + GetInstanceID());
  
           bannerView.Hide();
       }
  
       void HandleBannerAdEvents(bool subscribe)
       {
           Debug.Log("AdManager..HandleBannerAdEvents" + GetInstanceID());
           Debug.Log("AdManager..HandleBannerAdEvents..subscribe = "+ subscribe + GetInstanceID());
  
           if (subscribe)
           {
               Debug.Log("AdManager..HandleBannerAdEvents..if" + GetInstanceID());
  
               // Register for ad events.
               this.bannerView.OnAdLoaded += this.HandleAdLoaded;
               this.bannerView.OnAdFailedToLoad += this.HandleAdFailedToLoad;
               this.bannerView.OnAdOpening += this.HandleAdOpened;
               this.bannerView.OnAdClosed += this.HandleAdClosed;
               this.bannerView.OnAdLeavingApplication += this.HandleAdLeftApplication;
           }
           else
           {
               Debug.Log("AdManager..HandleBannerAdEvents..else" + GetInstanceID());
  
               // Register for ad events.
               this.bannerView.OnAdLoaded -= this.HandleAdLoaded;
               this.bannerView.OnAdFailedToLoad -= this.HandleAdFailedToLoad;
               this.bannerView.OnAdOpening -= this.HandleAdOpened;
               this.bannerView.OnAdClosed -= this.HandleAdClosed;
               this.bannerView.OnAdLeavingApplication -= this.HandleAdLeftApplication;
           }
       }
       #region Banner Callback Methods
       public void HandleAdLoaded(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdLoaded event received" + GetInstanceID());
           MonoBehaviour.print(String.Format("Ad Height: {0}, width: {1}",
               this.bannerView.GetHeightInPixels(),
               this.bannerView.GetWidthInPixels()));
           bannerAdStatus = 1;
       }
  
       public void HandleAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
       {
           MonoBehaviour.print(
                   "HandleFailedToReceiveAd event received with message: " + args.Message + GetInstanceID());
           bannerAdStatus = 2;
  
       }
  
       public void HandleAdOpened(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdOpened event received" + GetInstanceID());
           bannerAdStatus = 3;
  
       }
  
       public void HandleAdClosed(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdClosed event received" + GetInstanceID());
           bannerAdStatus = 4;
  
       }
  
       public void HandleAdLeftApplication(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdLeftApplication event received" + GetInstanceID());
           bannerAdStatus = 5;
  
       }
       #endregion
  
       #endregion
  
       #region InterstitialAd
  
       private void RequestInterstitial()
       {
           Debug.Log("AdManager..RequestInterstitial" + GetInstanceID());
  
   #if UNITY_EDITOR
           string adUnitId = "unused";
   #elif UNITY_ANDROID
               string adUnitId = "ca-app-pub-3940256099942544/1033173712";
   #elif UNITY_IPHONE
               string adUnitId = "ca-app-pub-3940256099942544/4411468910";
   #else
               string adUnitId = "unexpected_platform";
   #endif
           // Initialize an InterstitialAd.
           this.interstitial = new InterstitialAd(adUnitId);
  
  
  
           // Create an empty ad request.
           AdRequest request = new AdRequest.Builder().Build();
           // Load the interstitial with the request.
           this.interstitial.LoadAd(request);
           //testText.text = "RequestingInterstitial";
  
       }
  
       public void DisplayInterstitial()
       {
           Debug.Log("AdManager..DisplayInterstitial" + GetInstanceID());
           if (interstitial.IsLoaded())
           {
               Debug.Log("AdManager..DisplayInterstitial..IsLoaded" + GetInstanceID());
  
               interstitial.Show();
           }
           else
           {
               Debug.Log("AdManager..DisplayInterstitial..NotLoaded" + GetInstanceID());
  
               SceneManager.LoadScene(SceneIndexer.Gameplay);
  
           }
       }
  
       void HandleInterstitialAdEvents(bool subscribe)
       {
           Debug.Log("AdManager..HandleInterstitialAdEvents" + GetInstanceID());
  
           if (subscribe)
           {
               Debug.Log("AdManager..HandleInterstitialAdEvents..if" + GetInstanceID());
  
               // Called when an ad request has successfully loaded.
               this.interstitial.OnAdLoaded += HandleOnAdLoaded;
               // Called when an ad request failed to load.
               this.interstitial.OnAdFailedToLoad += HandleOnAdFailedToLoad;
               // Called when an ad is shown.
               this.interstitial.OnAdOpening += HandleOnAdOpened;
               // Called when the ad is closed.
               this.interstitial.OnAdClosed += HandleOnAdClosed;
               // Called when the ad click caused the user to leave the application.
               this.interstitial.OnAdLeavingApplication += HandleOnAdLeavingApplication;
           }
           else
           {
               Debug.Log("AdManager..HandleInterstitialAdEvents..else" + GetInstanceID());
  
               // Called when an ad request has successfully loaded.
               this.interstitial.OnAdLoaded -= HandleOnAdLoaded;
               // Called when an ad request failed to load.
               this.interstitial.OnAdFailedToLoad -= HandleOnAdFailedToLoad;
               // Called when an ad is shown.
               this.interstitial.OnAdOpening -= HandleOnAdOpened;
               // Called when the ad is closed.
               this.interstitial.OnAdClosed -= HandleOnAdClosed;
               // Called when the ad click caused the user to leave the application.
               this.interstitial.OnAdLeavingApplication -= HandleOnAdLeavingApplication;
           }
       }
  
       #region Interstitial Callback Methods
       public void HandleOnAdLoaded(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdLoaded event received");
           Debug.Log("HandleAdLoaded event received in debug" + GetInstanceID());
           interstitialAdStatus = 1;
       }
  
       public void HandleOnAdFailedToLoad(object sender, AdFailedToLoadEventArgs args)
       {
           MonoBehaviour.print("HandleFailedToReceiveAd event received with message: "
                               + args.Message);
           Debug.Log("HandleOnAdFailedToLoad event received in debug" + GetInstanceID());
  
           initTime = Time.time;
           interstitialAdStatus = 2;
       }
  
       public void HandleOnAdOpened(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdOpened event received");
           Debug.Log("HandleOnAdOpened event received in debug" + GetInstanceID());
  
           interstitialAdStatus = 3;
       }
  
       public void HandleOnAdClosed(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdClosed event received");
           Debug.Log("HandleOnAdClosed event received in debug" + GetInstanceID());
  
           //interstitial.Destroy();
           interstitialAdStatus = 4;
       }
  
       public void HandleOnAdLeavingApplication(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleAdLeavingApplication event received");
           Debug.Log("HandleOnAdLeavingApplication event received in debug" + GetInstanceID());
  
           interstitialAdStatus = 5;
  
  
       }
       #endregion
  
       #endregion
  
       #region RewardAd
       private void RequestRewardAd()
       {
           Debug.Log("AdManager..RequestRewardAd");
  
   #if UNITY_EDITOR
           string adUnitId = "unused";
   #elif UNITY_ANDROID
               string adUnitId = "ca-app-pub-3940256099942544/5224354917";
   #elif UNITY_IPHONE
               string adUnitId = "ca-app-pub-3940256099942544/1712485313";
   #else
               string adUnitId = "unexpected_platform";
   #endif
  
           this.rewardAd = new RewardedAd(adUnitId);
  
  
           // Create an empty ad request.
           AdRequest request = new AdRequest.Builder().Build();
           // Load the rewarded ad with the request.
           this.rewardAd.LoadAd(request);
       }
  
       public void DisplayRewardAd()
       {
           Debug.Log("AdManager..DisplayRewardAd");
  
           if (rewardAd.IsLoaded())
           {
               Debug.Log("AdManager..DisplayRewardAd..if");
  
               rewardAd.Show();
           }
       }
  
       void HandleRewardAdEvents(bool subscribe)
       {
           Debug.Log("AdManager..HandleRewardAdEvents");
  
           if (subscribe)
           {
               // Called when an ad request has successfully loaded.
               this.rewardAd.OnAdLoaded += HandleRewardedAdLoaded;
               // Called when an ad request failed to load.
               this.rewardAd.OnAdFailedToLoad += HandleRewardedAdFailedToLoad;
               // Called when an ad is shown.
               this.rewardAd.OnAdOpening += HandleRewardedAdOpening;
               // Called when an ad request failed to show.
               this.rewardAd.OnAdFailedToShow += HandleRewardedAdFailedToShow;
               // Called when the user should be rewarded for interacting with the ad.
               this.rewardAd.OnUserEarnedReward += HandleUserEarnedReward;
               // Called when the ad is closed.
               this.rewardAd.OnAdClosed += HandleRewardedAdClosed;
  
           }
           else
           {
               // Called when an ad request has successfully loaded.
               this.rewardAd.OnAdLoaded -= HandleRewardedAdLoaded;
               // Called when an ad request failed to load.
               this.rewardAd.OnAdFailedToLoad -= HandleRewardedAdFailedToLoad;
               // Called when an ad is shown.
               this.rewardAd.OnAdOpening -= HandleRewardedAdOpening;
               // Called when an ad request failed to show.
               this.rewardAd.OnAdFailedToShow -= HandleRewardedAdFailedToShow;
               // Called when the user should be rewarded for interacting with the ad.
               this.rewardAd.OnUserEarnedReward -= HandleUserEarnedReward;
               // Called when the ad is closed.
               this.rewardAd.OnAdClosed -= HandleRewardedAdClosed;
  
           }
       }
  
       #region RewardAd Callback Methods
       public void HandleRewardedAdLoaded(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleRewardedAdLoaded event received");
           rewardAdStatus = 1;
       }
  
       public void HandleRewardedAdFailedToLoad(object sender, AdErrorEventArgs args)
       {
           MonoBehaviour.print(
               "HandleRewardedAdFailedToLoad event received with message: "
                                + args.Message);
           rewardAdStatus = 2;
  
       }
  
       public void HandleRewardedAdOpening(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleRewardedAdOpening event received");
           rewardAdStatus = 3;
  
       }
  
       public void HandleRewardedAdFailedToShow(object sender, AdErrorEventArgs args)
       {
           MonoBehaviour.print(
               "HandleRewardedAdFailedToShow event received with message: "
                                + args.Message);
           rewardAdStatus = 4;
  
       }
  
       public void HandleRewardedAdClosed(object sender, EventArgs args)
       {
           MonoBehaviour.print("HandleRewardedAdClosed event received");
           rewardAdStatus = 5;
  
           //RequestRewardAd();
  
       }
  
       public void HandleUserEarnedReward(object sender, Reward args)
       {
           string type = args.Type;
           double amount = args.Amount;
           MonoBehaviour.print(
               "HandleRewardedAdRewarded event received for "
                           + amount.ToString() + " " + type);
           rewardAdStatus = 6;
  
       }
       #endregion
  
       #endregion
   }
  </code></pre>