Страницы

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

пятница, 12 июля 2019 г.

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

Реализовал в приложении загрузку и отображение рекламы 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(). Я в замешательстве. Что это может быть ?


Ответ

Нашел я причину возникновения этого явления.
Суть была в методе 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
И будьте внимательны ко всяким своим "Я ща попробую, а потом удалю". Потом может и не наступить! :-)

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

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