Android监听前后台切换展示开屏广告
来源:互联网 发布:炫舞炸家族邀请软件 编辑:程序博客网 时间:2024/04/30 14:16
此需求主要注意以下几点:
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 BaseApplication 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 BaseActivity 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>
阅读全文
0 0
- Android监听前后台切换展示开屏广告
- Android App前后台切换的监听
- 监听Android程序前后台切换
- android应用前后台切换的监听
- Android前后台切换
- 【Android】利用Activity生命周期监听应用前后台切换
- Android:监听应用前后台切换及思考
- Android:监听应用前后台切换及思考
- App前后台切换的监听
- android前后台切换技术
- android 前后台切换 回调
- Android 实现APP开屏广告
- android app前后台的监听
- 监听Android应用前后台运行状态
- android 监听应用前后台运行状态
- Android实现程序前后台切换效果
- Android实现程序前后台切换效果
- Android实现程序前后台切换效果
- 2017.7.5
- win7电脑只要一按键盘就蓝屏解决方法
- 导航控制器切换效果
- C存储类
- properties使用变量
- Android监听前后台切换展示开屏广告
- flv.js的用法与说明总结
- JDBC之使用懒汉式单例创建JDBC工具类
- 栈与堆
- Java简单记事本
- 相亲对象判别基于K-近邻算法
- Python 3.6 由于lxml依赖关系, 导入docx或python-docx失败的问题
- OpenCV中feature2D学习——SIFT和SURF算子实现特征点提取与匹配
- 如何踏上人工智能之路(机器学习篇)