如何使用intent预加载AdMob中间广告并发送到另一个android活动

如何使用intent预加载AdMob中间广告并发送到另一个android活动,android,android-intent,admob,interstitial,Android,Android Intent,Admob,Interstitial,我需要一些关于AdMob中间广告的帮助 我想在一个活动中预装间质广告。这是直截了当的 // Create an ad. interstitialAd = new InterstitialAd(this); interstitialAd.setAdUnitId(AD_UNIT_ID); AdRequest adRequest = new AdRequest.Builder() .addTestDevice(AdReq

我需要一些关于AdMob中间广告的帮助

我想在一个活动中预装间质广告。这是直截了当的

// Create an ad.
        interstitialAd = new InterstitialAd(this);
        interstitialAd.setAdUnitId(AD_UNIT_ID);

        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice(TEST_DEVICE_ID).build();

        // Load the interstitial ad.
        interstitialAd.loadAd(adRequest);
现在我想使用intent将中间广告发送到另一个活动。我不知道如何用电子邮件发送

intent.putExtra("myAd", interstitialAd);

提前感谢。

插播广告并非有意或无意通过意向书的附加内容来传播

最好是

  • 在下一活动中重新创建并重新加载广告
  • 制作一个额外的公共类来保存中间广告,将其放在活动A中,然后在活动B中从中检索它
第二种情况的示例(半伪代码):

使用

活动A

AdManager adManager = new AdManager();
adManager.createAd();
AdManager adManager = new AdManager();
adManager.createAd();
活动B

AdManager adManager = new AdManager();
InterstitialAd ad = adManager.getAd();
if (ad.isLoaded()) {
    ad.show();
}
AdManager adManager = new AdManager();
InterstitialAd ad = adManager.getAd();
if (ad.isLoaded()) {
    ad.show();
}

interstitalad
可以使用任何
上下文
进行实例化,这样您就可以在
应用程序
子类的
onCreate
期间实例化它(并请求ad),然后从代码中的任何位置显示ad

这样,你就最大限度地提高了广告在你想展示的时候被载入的机会


使用
AdManager(如另一个答案中所述)是一种很好的做法,但没有必要这样做。

通过使用单例设计模式解决了这个问题

/**
* Created by Kirk on 10/26/2017.
*/

public class AdManager {

private static AdManager singleton;

public AdManager() {
}

/***
 * returns an instance of this class. if singleton is null create an instance
 * else return  the current instance
 * @return
 */
public static AdManager getInstance() {
    if (singleton == null) {
        singleton = new AdManager();
    }

    return singleton;
}

/***
 * Create an interstitial ad
 * @param context
 */
public static void createAd(Context context) {
    interstitialAd = new InterstitialAd(context);
    interstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
    interstitialAd.loadAd(new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR).build());
}

/***
 * get an interstitial Ad
 * @return
 */
public static InterstitialAd getAd() {
    return interstitialAd;
}
}

在activityA中创建加载广告

    AdManager adManager = AdManager.getInstance();
    adManager.createAd(MainActivity.this);
在活动B中,通过检索和显示广告

    AdManager adManager = AdManager.getInstance();
    InterstitialAd ad =  adManager.getAd();

    if (ad.isLoaded()) {
        ad.show();
    }

在此活动中,您可以使用异步方式预加载ad对象:

int preLoaderId = PreLoader.preLoad(new Loader());
Intent intent = new Intent(this, AnotherActivity.class);
intent.putExtra("preLoaderId", preLoaderId);
startActivity(intent);

//DataLoader, pre-load ad object
class Loader implements DataLoader<InterstitialAd> {
    @Override
    public InterstitialAd loadData() {

        // Create an ad object.
        InterstitialAd interstitialAd = new InterstitialAd(ThisActivity.this);
        interstitialAd.setAdUnitId(AD_UNIT_ID);

        AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice(TEST_DEVICE_ID).build();

        // Load the interstitial ad.
        interstitialAd.loadAd(adRequest);
        return interstitialAd;
    }
}
int preLoad=preLoad.preLoad(new Loader());
Intent Intent=新的Intent(this,AnotherActivity.class);
意向。额外(“预验证”,预验证);
星触觉(意向);
//数据加载程序,预加载ad对象
类加载器实现数据加载器{
@凌驾
公共间隙加载数据(){
//创建一个广告对象。
interstitalad interstitalad=新的interstitalad(ThisActivity.this);
间质性setAdUnitId(AD_UNIT_ID);
AdRequest AdRequest=新建AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE\u ID\u仿真器)
.addTestDevice(测试设备ID).build();
//加载间隙ad。
间质负荷(adRequest);
返回间隙翼;
}
}
在OtherActivity中,您可以通过以下方式获取ad对象:

PreLoader.listenData(preLoaderId, new Listener());

//after ad load completed,DataListener.onDataArrived(...) will be called to process data
class Listener implements DataListener<InterstitialAd> {
    @Override
    public void onDataArrived(InterstitialAd ad) {
        //do sth with ad object
        //destroy this PreLoader by id if you don`t need it anymore
        PreLoader.destroy(preLoaderId);
    }
}
preload.listenData(preforerid,newlistener());
//ad加载完成后,将调用DataListener.onDataArrived(…)来处理数据
类侦听器实现DataListener{
@凌驾
已到达的公共空间(中间空间ad){
//以不正当的目的做某事
//如果您不再需要,请按id销毁此预加载程序
预加载。销毁(预加载);
}
}

希望这有帮助。

对于尝试过Tim答案但没有成功的人

不要创建广告两次!将构造函数更改为

    public AdManager(Context ctx) {
        this.ctx = ctx;
        //createAd(); //Remove this line! 
    }
最后,AdManager类应该是这样的:

public class AdManager {
    // Static fields are shared between all instances.
    static InterstitialAd ad;
    private Context ctx;

    public AdManager(Context ctx) {
        this.ctx = ctx;
       // createAd();
    }

    public void createAd() {
        // Create an ad.
        ad = new InterstitialAd(ctx);
        ad.setAdUnitId(AD_UNIT_ID);

        final AdRequest adRequest = new AdRequest.Builder()
                .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
                .addTestDevice(TEST_DEVICE_ID).build();

        // Load the interstitial ad.
        ad.loadAd(adRequest);
    }

    public InterstitialAd getAd() {
        return ad;
    }
}
使用

活动A

AdManager adManager = new AdManager();
adManager.createAd();
AdManager adManager = new AdManager();
adManager.createAd();
活动B

AdManager adManager = new AdManager();
InterstitialAd ad = adManager.getAd();
if (ad.isLoaded()) {
    ad.show();
}
AdManager adManager = new AdManager();
InterstitialAd ad = adManager.getAd();
if (ad.isLoaded()) {
    ad.show();
}

谢谢你,蒂姆。。但是在活动B中,我必须创建并初始化“admanager”,然后我将无法调用getAd();你可以通过制作一个静态广告来规避这个问题,见我的Editi Tim。。你的代码不起作用。。构造函数未定义。。请修复它。@AriefRivai哪个构造器hi Tim,希望你还在看这个。上面的代码不完整。我无法添加行INTERTINCALAD=新INTERTINCALAD(此);没有类“扩展上下文”。如果我让类扩展上下文,那么我也被迫将其抽象化,然后我们会遇到各种各样的问题。我可以用什么来代替问题行中的“这个”,我正在尝试的任何东西都不起作用。谢谢。hold
Interstitalad
在哪里?