#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 И будьте внимательны ко всяким своим "Я ща попробую, а потом удалю". Потом может и не наступить! :-)
Комментариев нет:
Отправить комментарий