只是提供一个简单的方法,因为我们所有的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();
}
}
```