我想出了一些解決此問題的東西,但我仍然不太喜歡解決方案。如果有人知道一個,會歡迎更優雅的方法。
我所做的是使用mMedia SDK而不是AdMob。他們的Interstitial和AdView類都可以在構造函數中使用Context而不是Activity。自從它在Dream疊加後面打開後,Interstitial仍然無法爲我工作。所以我最終做的是在我的Dream的XML佈局中添加一個AdView,然後將其可見性設置爲View.GONE直到我想顯示它。當顯示廣告時,我將其設置爲View.VISIBLE。
我遇到的另一個問題是,點擊AdView後,它會啓動帶有廣告URL的瀏覽器,這當然會在Dream後面打開,從而擊敗了展示廣告的目的。因此,我最終設定Dream爲交互式,抓住了onTouchEvent,然後如果廣告可見時點擊發生,請致電廣告的callOnClick方法。我還必須將廣告的RequestListener設置爲我的Dream Service,並實施MMAdOverlayLaunched方法,該方法在廣告啓動瀏覽器時調用。在這種方法中,我只是調用finish()來停止Dream並讓瀏覽器顯示廣告。
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
// Exit dream upon user touch
setInteractive(true);
// Hide system UI
setFullscreen(true);
// Set the dream layout
setContentView(R.layout.dream_layout);
//Initialize Ads
this.initAdvertising();
}
private void initAdvertising(){
MMSDK.initialize(this);
mDreamAd = (MMAdView) findViewById(R.id.adView);
//Separate thread will handle showing the ad
mDreamAd.setVisibility(View.GONE);
mAdRequest = new MMRequest();
//TODO add metadata to Request
mDreamAd.setMMRequest(mAdRequest);
mDreamAd.setListener(this);
mDreamAd.getAd();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event){
super.dispatchTouchEvent(event);
if(mDreamAd != null && mDreamAd.isShown()){
mDreamAd.callOnClick();
}
return true;
}
@Override
public void MMAdOverlayLaunched(MMAd ad) {
//Finish so we can display the ad the user has clicked
if(ad.equals(this.mDreamAd))
this.finish();
}
這是否最終運行良好?金錢/技術上?我的印象是,這不會被認爲是電池/ UX的好處。 – you786