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