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