1. 程式人生 > >android App一段時間沒有操作或沒有點選屏幕後彈出廣告,或者一段時間沒有點選螢幕進行特定操作。

android App一段時間沒有操作或沒有點選屏幕後彈出廣告,或者一段時間沒有點選螢幕進行特定操作。

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) {

            }

            @Override
public 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;
}
}