Donc, j'ai configuré mon annonce pour qu'elle s'affiche toutes les 5 minutes, mais le problème est que mon application affiche l'annonce même après que mon application est en arrière-plan et que j'utilise une autre application ou que je garde l'application en arrière-plan. Je veux que mes annonces d'application cessent de s'afficher après avoir mis l'application en arrière-plan (mes annonces ne s'affichent pas après la fermeture de l'application, ce qui est bien, mais en arrière-plan, c'est toujours le cas)

public class MainActivity extends AppCompatActivity {
    private InterstitialAd mInterstitialAd;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
        if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED ||
                connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {


            MobileAds.initialize(this,
                    "ca-app-pub-3940256099942544~3347551713");
            mInterstitialAd = new InterstitialAd(this);
            mInterstitialAd.setAdUnitId("ca-app-pub-3940255099942544/1033173712");
            mInterstitialAd.loadAd(new AdRequest.Builder().build());
            prepareAD();
            ScheduledExecutorService ScheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
            ScheduledExecutorService.scheduleAtFixedRate(new Runnable() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (mInterstitialAd.isLoaded()) {

                                mInterstitialAd.show();
                            } else {
                                Log.d("TAG", "Ad not loaded");
                            }
                            prepareAD();
                        }
                    });
                }
            }, 5, 5, TimeUnit.MINUTES);

        }else{
            Toast.makeText(getApplicationContext(), "No Internet Connection, please try again later...", Toast.LENGTH_LONG).show();

        }
    }

    public void prepareAD() {
        mInterstitialAd = new InterstitialAd(this);
        mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173212");
        mInterstitialAd.loadAd(new AdRequest.Builder().build());
    }

}
0
Amin Shinwari 8 févr. 2020 à 09:19

1 réponse

Meilleure réponse

Je suggérerai d'afficher l'application dans le fil principal au lieu d'un fil d'arrière-plan. Si vous passez quoi que ce soit pour vérifier si l'activité est active dans le thread d'arrière-plan, il y a des risques de fuite de mémoire.

Même s'il est en arrière-plan, il vérifiera l'état de l'activité et échouera.

getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)

À l'aide du composant de cycle de vie, procédez ainsi.

ScheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        boolean stateAlive = getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)
                        if (stateAlive && mInterstitialAd.isLoaded()) {

                            mInterstitialAd.show();
                        } else {
                            Log.d("TAG", "Ad not loaded");
                        }
                        prepareAD();
                    }
                });
            }
        }, 5, 5, TimeUnit.MINUTES);
0
vikas kumar 8 févr. 2020 à 06:35