Androidアプリはしばらく操作していないか、画面をクリックして広告をポップアップしていないか、画面をクリックして特定の操作をしていない.

19334 ワード

Androidアプリがしばらく操作されていないと、スクリーンセーバーの広告ページがポップアップします.
最近、appがどのactivityでも操作されていない間に屏保広告ページにジャンプし、広告ページをクリックするのは前のactivityに戻り、広告ページはお客様がバックグラウンドで設定した複数の画像やgifです.また、appがしばらく画面をクリックしていないうちに特定のインタフェースにジャンプするなど、自分で修正できるように変更することもできます.
では、この機能の実現の考え方を考えてみましょう.まず、すべてのactivityがこの機能を持っていなければならないので、1つのBaseActivityでその機能を実現し、他のActivityがBaseActivityを継承すればいいのです.
ステップ1: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

ステップ2:タイミング広告の設定
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);
}


ステップ4:広告タイミングが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;
    }
}