我想出了解决这个问题的方法,尽管我仍然不太喜欢这个解决方案。如果有人知道,将欢迎一种更优雅的方法。
我所做的是使用 mMedia SDK 而不是 AdMob。它们的 Interstitial 和 AdView 类都可以在构造函数中使用 Context 而不是 Activity。Interstitial 对我来说仍然没有效果,因为它在 Dream 叠加层后面打开。所以我最终做的是在 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();
}