美文网首页
通过rxjava倒计时,实现屏保

通过rxjava倒计时,实现屏保

作者: 小玉1991 | 来源:发表于2018-10-11 18:52 被阅读45次

实现屏保有很多种方式,比如通过activity的onDispatchEvent不断判断最近一次操作的时间间隔,大于一个数的时候,弹出屏保的activity。我这里用 的是倒计时。之前用CountDownTimer和handler做过一版,发现维护起来比较麻烦,容易造成内存泄漏。

用rxjava实现倒计时

//倒计时的关键代码
    public Observable<Integer> countdown(int delay, int time) {
        if (time < 0) time = 0;

        final int countTime = time;
        Observable<Integer> observable = Observable.interval(delay, 1, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<Long, Integer>() {
                    @Override
                    public Integer call(Long increaseTime) {
                        return countTime - increaseTime.intValue();
                    }
                })
                .take(countTime + 1);

        return observable;

    }

全部代码如下

package com.wdedu.k12.tpad.base;

import android.content.Intent;
import android.view.KeyEvent;
import android.view.MotionEvent;

import com.wdedu.k12.tpad.util.LogUtils;
import com.wdedu.k12.tpad.util.SPStoreUtil;

import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription;

import static com.wdedu.k12.tpad.config.WDConstant.Is_Share_Screen;

/**
 * Created by cc on 2018/10/11.
 */

public abstract class BaseScreenActivity extends BaseActivity {

    /* 静止超过N秒将自动进入屏保 */
    private int mHoldStillTime = 10;
    private static final int Screen_Req_Code = 110;
    private CompositeSubscription mCompositeSubscription = new CompositeSubscription();
    private boolean isWork = false;


    /**
     * 显示屏保
     */
    private void showScreenSaver() {

        Intent intent = new Intent(this, ScreenActivity.class);
        startActivityForResult(intent, Screen_Req_Code);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == Screen_Req_Code) {
            startScreenProtect(0);
        }

    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {

        LogUtils.i("screen-- dispatchKeyEvent");
        reStartScreenProtect();
        return super.dispatchKeyEvent(event);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        LogUtils.i("screen-- dispatchTouchEvent");
        reStartScreenProtect();
        return super.dispatchTouchEvent(ev);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        mCompositeSubscription.clear();
    }


    protected void startScreenProtect(int delay) {
        if (delay == 0) {
            isWork = true;
        }

        Subscription subscribe = countdown(delay, mHoldStillTime)
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {
                        LogUtils.i("screen-- start gif screen protected");
                        showScreenSaver();
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        LogUtils.i("screen-- stand time:" + integer + "  thread name" + Thread.currentThread().getName());

                    }
                });
        if (mCompositeSubscription.hasSubscriptions()) {
            mCompositeSubscription.clear();
        }
        mCompositeSubscription.add(subscribe);

    }

    protected void stopScreenProtect() {
        mCompositeSubscription.clear();
        isWork = false;
    }

    protected void reStartScreenProtect() {

        if (isWork && SPStoreUtil.getBoolean(Is_Share_Screen)) {
            mCompositeSubscription.clear();
            startScreenProtect(3);
        }

    }
//倒计时的关键代码
    public Observable<Integer> countdown(int delay, int time) {
        if (time < 0) time = 0;

        final int countTime = time;
        Observable<Integer> observable = Observable.interval(delay, 1, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<Long, Integer>() {
                    @Override
                    public Integer call(Long increaseTime) {
                        return countTime - increaseTime.intValue();
                    }
                })
                .take(countTime + 1);

        return observable;

    }


}

屏保的activity就用一个半透明的activity即可。

public class ScreenActivity extends Activity {


    private ImageView ivScreenGif;
    private View rootView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.activity_layout_screen);
        initialized();
    }
...
}
<style name="DialogActivity" parent="@style/AppTheme">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item>
    </style>

在manifest文件中

<activity
            android:name="com.wdedu.k12.tpad.activity.ScreenActivity"
            android:launchMode="singleTop"
            android:screenOrientation="landscape"
            android:theme="@style/DialogActivity" />

相关文章

  • 通过rxjava倒计时,实现屏保

    实现屏保有很多种方式,比如通过activity的onDispatchEvent不断判断最近一次操作的时间间隔,大于...

  • android倒计时使用rxJava实现

    使用rxJava实现倒计时60秒 private var disposable: Disposable? =nul...

  • RxJava 之 操作符

    什么是RxJava## RxJava 就是异步 RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。 一...

  • RxJava 之 响应式编程

    什么是RxJava## RxJava 就是异步 RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。 一...

  • RxJava 之 Android使用初体验

    什么是RxJava## RxJava 就是异步 RxJava 的异步实现,是通过一种扩展的观察者模式来实现的。 一...

  • RxJava实现RxBus

    通过 RxJava 实现RxBus 1.添加依赖: compile'io.reactivex:rxjava:1.0...

  • RxJava 之 Hello World

    原理介绍## 什么是RxJava## RxJava 就是异步 RxJava 的异步实现,是通过一种扩展的观察者模式...

  • 打造属于自己的RxBus

    RxBus 通过RxJava实现Rxbus。 相信大家已经非常熟悉EventBus了。最近正在学习Rxjava,如...

  • 第十二章:DreamManagerService

    简介 DreamManagerService主要是提供屏保服务,应用可以通过继承DreamService实现自己想...

  • 倒计时

    handler倒计时 RxJava倒计时(TianYu用不了)

网友评论

      本文标题:通过rxjava倒计时,实现屏保

      本文链接:https://www.haomeiwen.com/subject/sdciaftx.html