Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

После вызова onAdClosed activity переходит по циклу своему в onDestroy

#android #android_fragment #activity #admob


Реализовал в приложении загрузку и отображение рекламы AdMob типа Interstitial /
Межстраничный. 

Переходы: Запуск -> ActivitySplash -> Activity2 -> ActivityMain

Пользователь запускает приложение, смотрит на ActivitySplash, в onCreate() которого
присутствует код


AdMobInterstitialLoader adMobInterstitialLoader = new AdMobInterstitialLoader(this);
adMobInterstitialLoader.createAd();


Класс AdMobInterstitialLoader


public class AdMobInterstitialLoader {

    private static boolean isInterAdsShowed = false;
    private Activity mActivity;

    // static fields are shared between all instances
    private static InterstitialAd mInterstitialAd;

    public AdMobInterstitialLoader(Activity activity) {
        this.mActivity = activity;
        createAd();
    }

    public void createAd() {
        // create an Ad
        mInterstitialAd = new InterstitialAd(mActivity);
        mInterstitialAd.setAdUnitId(mActivity.getString(R.string.interstitial_ad_unit_id));

        AdRequest adRequest;
        // DEBUG or RELEASE
        if (BuildConfig.DEBUG) {
                adRequest = new AdRequest.Builder()
                        .addTestDevice(DeviceHash.getMyDeviceHash())
                        .build();
        } else {
            adRequest = new AdRequest.Builder()
                    .build();
        }

        // load the interstitial ad
        mInterstitialAd.loadAd(adRequest);

        mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdLoaded() {
                if (mInterstitialAd.isLoaded()) {
                    mInterstitialAd.show();
                }
            }
        });
    }

    public static InterstitialAd getInterstitialAd() {
        if (mInterstitialAd != null
                && mInterstitialAd.isLoaded()
                && !isInterAdsShowed) {
            isInterAdsShowed = true;
            return mInterstitialAd;
        } else {
            return null;
        }
    }

}



После отображения ActivitySplash его я принудительно уничтожаю, чтобы юзер в будущем
не смог аппаратной кнопкой Назад вернуть. Применяю finish(). Грубовато, но ничего другого
не придумал пока.

Activity2 доступно пользователю ТОЛЬКО, если это первый запуск приложения. Поэтому
в последующих запусках мы просто его не вызываем, а сразу на ActivityMain. Оно загружается,
и, когда приложение загрузило полностью Interstitial баннер, оно его сразу же отображает
(это прописано в методе обратного вызова класса AdMobInterstitialLoader.

В ActivityMain чередуются Fragment'ы.

Сама проблема.

Запускаю приложение, прохожу по Activity, загружается полностью ActivityMain, отображается
нужный Fragment, поверх экрана появляется Interstitial баннер, я его закрываю крестиком
вверху или аппаратной кнопкой Назад. Вместе с баннером закрывается приложение.

По логам видно, что Activity и Fragment уверенно прошлись по своим жизненным  циклам
до onDestroy(). Я в замешательстве. Что это может быть ? 
    


Ответы

Ответ 1



Нашел я причину возникновения этого явления. Суть была в методе startNextActivity(), реализация которого - примитив. И, естественно, я его свернул, т.к. нечего в нем дорабатывать или улучшать. Но, когда появляется нездоровое поведение приложения, начинаешь заглядывать во все углы кода. Моя проблема была заключена в флаге Intent.FLAG_ACTIVITY_NO_HISTORY, который я когда-то поставил для некоторых нужд. И ЗАБЫЛ // [ START startNextActivity() ] private void startNextActivity(Class nextActivityClass) { Intent intent = new Intent(this, nextActivityClass); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } // [ END startNextActivity() ] Этот флаг нужно удалить Материал по Intent и флагам: ENG - Intent @ developer.android.com RU - Урок 116. Поведение Activity в Task. Intent-флаги, launchMode, affinity @ http://startandroid.ru И будьте внимательны ко всяким своим "Я ща попробую, а потом удалю". Потом может и не наступить! :-)

Комментариев нет:

Отправить комментарий