Android监听前后台切换展示开屏广告

本文介绍了一种在移动端应用中实现广告展示的技术方案,包括前后台切换监听、广告展示时机选择及间隔控制等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此需求主要注意以下几点:
1、前后台切换监听
解决方案:在BaseApplication中通过
registerActivityLifecycleCallbacks(new LifecycleHandler());
来监听前后台的切换。
2、从任何页面切换到后台再切回到前台都可以展示广告页
解决方案:在BaseAvtivity的onStart()方法里通过

 getWindowManager().addView(mAdView, params);

来添加广告页。
3、一定时间段内前后台切换不要出现广告页
解决方案:通过记录上次开屏广告的时间与当前时间的差值来判断是否显示广告。
System.currentTimeMillis() - mLastADTime > mADInterval;
4、广告页面倒计时n秒后消失
解决方案:利用CountDownTimer来进行倒计时。

Show u my code

Step1:BaseApplication
public class DemoBaseApplication extends MultiDexApplication {
@Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new LifecycleHandler());
    }
    .....
    }
class LifecycleHandler implements Application.ActivityLifecycleCallbacks {
    public static final int STATE_NORMAL = 0;
    public static final int STATE_BACK_TO_FRONT = 1;
    public static final int STATE_FRONT_TO_BACK = 2;
    public static int sAppState = STATE_NORMAL;
    private int mVisibleActivityCount = 0;

   @Override
    public void onActivityStarted(Activity activity) {
        // 每有一个activity可见都会走该方法,mVisibleActivityCount会增1。
        mVisibleActivityCount++;
        if (mVisibleActivityCount == 1) {
            // 从后台进入前台
            sAppState = STATE_BACK_TO_FRONT;
        } else {
            // 否则是正常状态
            sAppState = STATE_NORMAL;
        }
    }

    @Override
    public void onActivityStopped(Activity activity) {
        //每有一个acitivity不可见都会走该方法,让mVisibleActivityCount减1。
        mVisibleActivityCount--;
        if (mVisibleActivityCount == 0) {
            // 从前台进入后台
            sAppState = STATE_FRONT_TO_BACK;
        } else {
            // 否则是正常状态
            sAppState = STATE_NORMAL;
        }
    }
    .....
   } 
Step2: BaseActivity
public abstract class DemoBaseActivity extends AppCompatActivity{
    // 广告显示时间
    private long mADDuration = 1000 * 4;
    // 广告显示间隔时间, 间隔内不出现广告
    private long mADInterval = 1000 * 20;
    // 上次显示广告的时间
    private long mLastADTime = 0;
    //广告页的view
    private View mAdView;
    private ImageView mIvAd;
    private TextView mTvTimer;
    private CountDownTimer mTimer;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initAdView();
    }

     private void initAdView() {
        mAdView = View.inflate(this, R.layout.activity_base_ad_view, null);
        mIvAd = (ImageView) mAdView.findViewById(R.id.iv_ad);
        mTvTimer = (TextView) mAdView.findViewById(R.id.tv_timer);
        mTimer = new CountDownTimer(mADDuration, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                String text = (millisUntilFinished / 1000) + "s";
                mTvTimer.setText(text);
            }

            @Override
            public void onFinish() {
                if (mAdView != null) {
                    mTvTimer.setText("0s");
                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            getWindowManager().removeViewImmediate(mAdView);
                        }
                    }, 100);
                }
            }
        };
    }

 @Override
    protected void onStart() {
        super.onStart();
        // 判断是否从后台恢复, 且时间间隔符合要求, 显示广告页面
        boolean isFromBackToFront = LifecycleHandler.sAppState == LifecycleHandler.STATE_BACK_TO_FRONT;
        if (isFromBackToFront && canShowAD()) {
            showAD();
        }
    }
 /**
     * 显示广告
     */
    private void showAD() {
        // 显示广告页面
        createADView();
        // 随机显示一个广告页
        showRandomAD();
        // 开始倒计时
        mTimer.cancel();
        mTimer.start();
        // 记录显示广告的时间, 以便后续比对
        mLastADTime = System.currentTimeMillis();
    }

    /**
     * 判断两次时间是否大于规定的间隔
     *
     * @return true大于间隔, 否则false
     */
    private boolean canShowAD() {
        return System.currentTimeMillis() - mLastADTime > mADInterval;
    }

    private void createADView() {
        WindowManager.LayoutParams params = new WindowManager.LayoutParams();
        params.x = 0;
        params.y = 0;
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.MATCH_PARENT;
        getWindowManager().addView(mAdView, params);
    }

    private void showRandomAD() {
        switch (new Random().nextInt(3)) {
            case 0:
                mIvAd.setImageResource(R.drawable.no_data_remind);
                break;
            case 1:
                mIvAd.setImageResource(R.drawable.no_data_remind);
                break;
            case 2:
                mIvAd.setImageResource(R.drawable.no_data_remind);
                break;
        }
    }
....

}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_ad"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/tv_timer"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="time"
        android:textSize="30sp" />
</RelativeLayout>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值