android App一段時間沒有操作或沒有點選屏幕後彈出廣告,或者一段時間沒有點選螢幕進行特定操作。
阿新 • • 發佈:2019-01-27
android App沒有操作一段時間後彈出屏保廣告頁面
最近做了個專案,裡面有個功能是app在任何activity中沒有操作一段時間後要跳轉到屏保廣告頁面,點選廣告頁面是返回上一個activity中,並且廣告頁面是客戶在後臺設定的多張圖片或者gif。也可以改成是app在沒有一段時間沒有點選屏幕後跳轉到特定的介面等等,可以自己修改。 那麼,來想想這功能的實現思路吧。首先,是全部activity都要有這功能,那就在一個BaseActivity裡面實現該功能,然後其他Activity繼承BaseActivity就可以了。 第一步 :app設定長亮,不可暗屏,抽象一個公共的方法給子類Activity設定layout。@Override第二步:設定定時廣告protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設定螢幕長亮 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); setContentView(getLayoutRes()); } protected abstract int getLayoutRes();@Override
private long advertisingTime = 15 * 1000;//定時跳轉廣告時間
/** * 跳轉廣告 */ public void startAD() { if (countDownTimer == null) { countDownTimer = new CountDownTimer(advertisingTime, 1000l) { @Override public void onTick(long millisUntilFinished) { } @Overridepublic void onFinish() { //定時完成後的操作 } }; countDownTimer.start(); } else { countDownTimer.start(); } }
第三步:設定螢幕點選監聽;這一步要重寫dispatchTouchEvent就好了,不要重寫onTouchEvent。onTouchEvent自能監聽到空白處的點選,其他控制元件或者是View的點選事件是監聽不到的。不瞭解的可以看一下事件分發。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: //有按下動作時取消定時 if (countDownTimer != null){ countDownTimer.cancel(); } break; case MotionEvent.ACTION_UP: //擡起時啟動定時 startAD(); break; } return super.dispatchTouchEvent(ev); }
第四步:廣告定時在activity啟動或者是取消操作, CountDownTimer在Activity銷燬或者是不在前臺還是在執行的,所以要在Activity的生命週期中控制一下。
@Override protected void onResume() { super.onResume(); //顯示是啟動定時 startAD(); } @Override protected void onPause() { super.onPause(); //當activity不在前臺是停止定時 if (countDownTimer != null){ countDownTimer.cancel(); } } @Override protected void onDestroy() { super.onDestroy(); //銷燬時停止定時 if (countDownTimer != null){ countDownTimer.cancel(); } }
將程式碼貼出來,有什麼不對的歡迎指出: BaseActivity的程式碼:
package com.demo.myadvertising; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.CountDownTimer; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.MotionEvent; import android.view.WindowManager; /** * Author: * Date: 2017/8/10 * Description: */ public abstract class BaseActivity extends AppCompatActivity { public CountDownTimer countDownTimer; private long advertisingTime = 15 * 1000;//定時跳轉廣告時間 public Context context; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //設定螢幕長亮 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); context = this; setContentView(getLayoutRes()); } protected abstract int getLayoutRes(); @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: //有按下動作時取消定時 if (countDownTimer != null){ countDownTimer.cancel(); } break; case MotionEvent.ACTION_UP: //擡起時啟動定時 startAD(); break; } return super.dispatchTouchEvent(ev); } /** * 跳轉廣告 */ public void startAD() { if (countDownTimer == null) { countDownTimer = new CountDownTimer(advertisingTime, 1000l) { @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { //定時完成後的操作 //跳轉到廣告頁面 startActivity(new Intent(context,ADActivity.class)); } }; countDownTimer.start(); } else { countDownTimer.start(); } } @Override protected void onResume() { super.onResume(); //顯示是啟動定時 startAD(); } @Override protected void onPause() { super.onPause(); //當activity不在前臺是停止定時 if (countDownTimer != null){ countDownTimer.cancel(); } } @Override protected void onDestroy() { super.onDestroy(); //銷燬時停止定時 if (countDownTimer != null){ countDownTimer.cancel(); } } }
其他Activity繼承BaseActivity就可以實現功能,例如MainActivity:
package com.demo.myadvertising; import android.os.Bundle; public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override protected int getLayoutRes() { return R.layout.activity_main; } }