2020-01-09 简易实现屏保

只是提供一个简单的方法,因为我们所有的activity基本基于一个baseActivity,故可以借由延时handler实现无操作xxx秒后显示屏保的效果:

1.先创建Screensaver 工具类:

```

import android.os.Handler;

import android.os.Message;

/**

* 计时程序

*/

public class Screensaver {

private static final int MSG_TIMEOUT =0x0;

    private static final int SECOND =1000;

    private static final int MINUTE =SECOND *60;

    private static final int DEFAULT_TIMEOUT =MINUTE *3; //默认为3分钟

    private OnTimeOutListenermOnTimeOutListener;

    private int mScreensaverTiemout =DEFAULT_TIMEOUT;//默认为3分钟

    private HandlermHandler =new Handler(){

@Override

        public void handleMessage(Message msg) {

super.handleMessage(msg);

            if(msg.what ==MSG_TIMEOUT){

//调用回调通知接收者

                if(mOnTimeOutListener !=null){

mOnTimeOutListener.onTimeOut(Screensaver.this);

                }

//                start(); //重新开始计时

            }

}

};

    public Screensaver(int screensaverTiemout) {

mScreensaverTiemout = screensaverTiemout;

    }

public Screensaver() {

}

/**

* 开始计时

*/

    public void start(int time) {

mHandler.removeMessages(MSG_TIMEOUT);

        Message message =mHandler.obtainMessage(MSG_TIMEOUT); //包装消息

        mHandler.sendMessageDelayed(message, time); //延时发送消息

    }

/**

* 停止计时

*/

    public void stop() {

mHandler.removeMessages(MSG_TIMEOUT); //移除消息

    }

/**

* 重置时间

*/

    public void resetTime(int time) {

stop();

        start(time);

    }

public void setScreensaverTiemout(int mScreensaverTiemout) {

this.mScreensaverTiemout = mScreensaverTiemout;

    }

public int getScreensaverTiemout() {

return mScreensaverTiemout;

    }

public void setOnTimeOutListener(OnTimeOutListener onTimeOutListener) {

this.mOnTimeOutListener = onTimeOutListener;

    }

/**

* 屏幕保护时间到监听

*/

    public interface OnTimeOutListener {

void onTimeOut(Screensaver screensaver);

    }

}

```

2.在baseActivity的onCreate中进行注册

```

mSc`reensaver =new Screensaver(XXX*1000); //定时XXX秒

mScreensaver.setOnTimeOutListener(this); //监听

mScreensaver.start(SCREENSAVERTIME*1000); //开始计时

```


3.在baseActivity中写入触摸或者按键(tv端)重新计时方法:

```

/**

* 当触摸就会执行此方法

*/

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

Log.d(TAG, "重置时间"+mScreensaver);

mScreensaver.resetTime(SCREENSAVERTIME*1000); //重置时间

  return super.dispatchTouchEvent(ev);

}

/**

* 当使用键盘就会执行此方法

*/

@Override

public boolean dispatchKeyEvent(KeyEvent event) {

Log.d(TAG, "重置时间"+mScreensaver);

  mScreensaver.resetTime(SCREENSAVERTIME*1000); //重置时间

  return super.dispatchKeyEvent(event);

}

```

4.根据生命周期控制计时:

```

@Override

protected void onResume() {

Log.d(TAG, "恢复计时");

  super.onResume();

  mScreensaver.start(SCREENSAVERTIME*1000); //开始计时

}

@Override

protected void onPause() {

mScreensaver.stop(); //停止计时

  super.onPause();

}

```

5.加入TimeOut时处理:

```

/**

* 时间到就会执行此方法

*/

@Override

public void onTimeOut(Screensaver screensaver) {

Log.d(TAG, "时间到了");

startActivity(new Intent(this,ScreenSaverActivity.class));//这里写入跳转屏保

}

```

下面是我用的屏保视频方法:

```

public class ScreenSaverActivityextends Activityimplements MediaPlayer.OnCompletionListener {

private VideoViewvideo_screen;

    private StringVIDEO_URL ="XXXXX";

    private ContextmContext;

    private final int FINISH =101;

    private Handlerhandler =new Handler() {

public void handleMessage(Message msg) {

switch (msg.what) {

case FINISH:

finish();

break;

            }

}

};

    @Override

    protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_screensaver);

        mContext =this;

        initView();

    }

private void initView() {

video_screen = findViewById(R.id.video_screen);

        HttpProxyCacheServer proxy = getProxy();

        String proxyUrl = proxy.getProxyUrl(VIDEO_URL);

        video_screen.setVideoPath(proxyUrl);

        video_screen.start();

        video_screen.setOnCompletionListener(this);

    }

private HttpProxyCacheServergetProxy() {

return MyApplication.getProxy(this);

    }

@Override

    public boolean dispatchKeyEvent(KeyEvent event) {

handler.sendEmptyMessage(FINISH);

        return super.dispatchKeyEvent(event);

    }

@Override

    public void onCompletion(MediaPlayer mediaPlayer) {

mediaPlayer.seekTo(0);

        mediaPlayer.start();

    }

}

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容