开发环境为eclipse,因为demo简单就没有使用android studio,android studio每次运行都要gradle编译一次,速度慢。

项目需要,做了一个Android TV 视频播放器的屏保,大概的需求就是app在没有播放视频的情况了五分钟没有操作就跳出屏保,屏保接入广告系统。我下面给出的例子demo在时间超时的时候会跳出屏幕,在接收到锁屏广播的时候也会显示屏保。

主要讲一下使用双线程来实现五分钟无操作跳出屏保,可以在application里面启动监听线程,也可以在activity的oncreated方法里面启动监听,下面是双线程实现的屏保:

package com.example.screensaverdemo;import java.util.Date;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
/*** * @author Danxingxi created on 2015/11/29**/
public class MainActivity extends Activity {private Handler mHandler01 = new Handler();private Handler mHandler02 = new Handler();/* 上一次User有动作的Time Stamp */private Date lastUpdateTime;/* 计算User有几秒没有动作的 */private long timePeriod;/* 静止超过N秒将自动进入屏保 */private float mHoldStillTime = 10;/*标识当前是否进入了屏保*/private boolean isRunScreenSaver;/*时间间隔*/private long intervalScreenSaver = 1000;private long intervalKeypadeSaver = 1000;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);((Button)findViewById(R.id.start_screen_Saver)).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent mService = new Intent(MainActivity.this, ScreenService.class);mService.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startService(mService);}});/* 初始取得User可触碰屏幕的时间 */lastUpdateTime = new Date(System.currentTimeMillis());}/*** 计时线程*/private Runnable mTask01 = new Runnable() {@Overridepublic void run() {Date timeNow = new Date(System.currentTimeMillis());/* 计算User静止不动作的时间间距 *//**当前的系统时间 - 上次触摸屏幕的时间 = 静止不动的时间**/timePeriod = (long) timeNow.getTime() - (long) lastUpdateTime.getTime();/*将静止时间毫秒换算成秒*/float timePeriodSecond = ((float) timePeriod / 1000);if(timePeriodSecond > mHoldStillTime){if(isRunScreenSaver == false){  //说明没有进入屏保/* 启动线程去显示屏保 */mHandler02.postAtTime(mTask02, intervalScreenSaver);/*显示屏保置为true*/isRunScreenSaver = true;}else{/*屏保正在显示中*/}}else{/*说明静止之间没有超过规定时长*/isRunScreenSaver = false;}/*反复调用自己进行检查*/mHandler01.postDelayed(mTask01, intervalKeypadeSaver);   }};/*** 持续屏保显示线程*/private Runnable mTask02 = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubif (isRunScreenSaver == true) {  //如果屏保正在显示,就计算不断持续显示
//              hideOriginalLayout();showScreenSaver();mHandler02.postDelayed(mTask02, intervalScreenSaver);} else {mHandler02.removeCallbacks(mTask02);  //如果屏保没有显示则移除线程}}};/*** 显示屏保*/private void showScreenSaver(){Log.d("danxx", "显示屏保------>");Intent intent = new Intent(MainActivity.this, ScreenSaverActivity.class);startActivity(intent);}@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {updateUserActionTime();return super.dispatchKeyEvent(event);}/*用户有操作的时候不断重置静止时间和上次操作的时间*/public void updateUserActionTime() {Date timeNow = new Date(System.currentTimeMillis());timePeriod = timeNow.getTime() - lastUpdateTime.getTime();lastUpdateTime.setTime(timeNow.getTime());}@Overrideprotected void onResume() {/*activity显示的时候启动线程*/mHandler01.postAtTime(mTask01, intervalKeypadeSaver);super.onResume();}@Overrideprotected void onPause() {/*activity不可见的时候取消线程*/mHandler01.removeCallbacks(mTask01);mHandler02.removeCallbacks(mTask02);super.onPause();}}

屏保就是一个新的Activity,我们可以在屏保activity里接入展示广告,做任意操作,下面是启动一个服务,当用户按锁屏键锁屏的时候会发送一个广播,我们在服务中接受到广播后可以屏蔽系统的锁屏,显示我们自己的锁屏:

package com.example.screensaverdemo;import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;public class ScreenService extends Service {KeyguardManager mKeyguardManager = null;   private KeyguardLock mKeyguardLock = null;  BroadcastReceiver mMasterResetReciever;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Override   public void onCreate() { //Log.e("ScreenService","onCreate()");// TODO Auto-generated method stub startScreenService();super.onCreate();   }   @Override   public void onStart(Intent intent, int startId) {  // Log.e("ScreenService","onStart");// TODO Auto-generated method stub   startScreenService();}private void startScreenService(){mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);   mKeyguardLock = mKeyguardManager.newKeyguardLock("");mKeyguardLock.disableKeyguard();   //Intent.ACTION_SCREEN_OFFmMasterResetReciever = new BroadcastReceiver() {   @Overridepublic void onReceive(Context context, Intent intent) {   try { Intent i = new Intent();   i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setClass(context, ScreenSaverActivity.class);                        context.startActivity(i); } catch (Exception e) {                      Log.i("mMasterResetReciever:", e.toString());   }   }   };           registerReceiver(mMasterResetReciever, new IntentFilter(Intent.ACTION_SCREEN_OFF));   }@Overridepublic void onDestroy() {//Log.e("ScreenService","onDestroy()");super.onDestroy();unregisterReceiver(mMasterResetReciever);  ScreenService.this.stopSelf();}
}

1.Demo下载地址

屏保Activity:

全局屏保实现思路:首先你要用service和广播来做开机启动,困难的就是要监听用户操作,只要有用户操作设备就要重置锁屏计时器,把你的锁屏计时器等一些操作放在service后台运行,做一下保活防止被杀死,至于监听用户的操作,由于是操作的别的app,只能通过Android设备的自动锁屏,拦截系统的自动锁屏跳出我们自己的屏保,两篇文章请参考:http://www.jb51.net/article/97067.htm 和 http://blog.csdn.net/mengweiqi33/article/details/18094221

Android APP一段时间无操作显示屏保相关推荐

  1. android App一段时间没有操作或没有点击屏幕后弹出广告,或者一段时间没有点击屏幕进行特定操作。

    android App没有操作一段时间后弹出屏保广告页面 最近做了个项目,里面有个功能是app在任何activity中没有操作一段时间后要跳转到屏保广告页面,点击广告页面是返回上一个activity中 ...

  2. android中屏保功能项目,【Android】一段时间不操作弹出【屏保】效果

    仿屏保效果 最近项目的一个小Demo,和大家分享一下,本篇文章主要展示的是一个仿屏保的效果,用户在一段时间不操作会自动弹出屏保页面,当处于屏保页面的时候,[两秒内连续]按两次键盘[回车键]就会退出屏保 ...

  3. Android一段时间无操作之后,进入广告轮播界面,以及触摸之后停止轮播

    想要的图片轮播Activity public class BannerMediaActivity extends AppCompatActivity implements View.OnClickLi ...

  4. putty连接centos/Ubuntu一段时间无操作无法输入 死机 断线解决办法

    解决办法比较简单: PuTTY设置,putty -> Connection -> Seconds between keepalives ( 0 to turn off ),默认为0,改为5 ...

  5. MYSQL连接一段时间不操作后出现异常的解决方案

    MYSQL连接一段时间不操作后出现异常的解决方案 参考文章: (1)MYSQL连接一段时间不操作后出现异常的解决方案 (2)https://www.cnblogs.com/bokejiayuan/p/ ...

  6. php到期自动过期,PHP实现页面长时间无操作,自动过期函数

    PHP实现页面长时间无操作,自动过期函数 发布于 2015-01-13 19:55:41 | 878 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertex ...

  7. 解决终端SSH连接服务器一段时间不操作之后卡死的问题

    解决终端SSH连接服务器一段时间不操作之后卡死的问题 参考文章: (1)解决终端SSH连接服务器一段时间不操作之后卡死的问题 (2)https://www.cnblogs.com/pandawan/p ...

  8. Android App 设置系统时间,语言和时区、系统重启

    文章目录 说明 1. 修改系统时间 1. 设置系统时间(仅设置xx:xx) 2. 设置系统日期(仅设置到xxxx年xx月xx日) 3.设置系统是否自动获取时间 4.判断系统是否自动获取时间 2. 修改 ...

  9. mac一段时间不操作会死机

    台式机mac一段时间不操作,就会界面卡死,只能移动鼠标,然后会自动重启. 解决办法: 关机,然后拔掉电源,15秒后重新接回电源. 5秒后重新开机.解决了.

最新文章

  1. 《C++面向对象高效编程(第2版)》——2.29 泛化关系(is-a)
  2. 优秀好文收录(持续更新...)
  3. 【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )
  4. MATLAB实现最优低通滤波器的函数
  5. C++ Primer 5th笔记(chap 15 OOP)构造函数和拷贝控制
  6. 使用VirtualAlloc在0x400000处申请内存
  7. [转载] 杜拉拉升职记——15 1001个笑话
  8. 普通用户nginx访问不了_Nginx降权启动之使用普通用户管理 | it运维_it技术_linux运维-追梦人博客...
  9. javascript 排序_JavaScript中的排序方法
  10. android图片压缩上传系列-基础篇
  11. PHP初入--表单元素
  12. 将Subversion(SVN)日志记录导出到excel表格(理论windows和Linux通用)
  13. 微型计算机系统与接口重要吗,微型计算机系统与接口 马宏锋 等编著 第六章
  14. domcer服务器按键显示怎么调,我的世界domcer怎么打开按键显示_我的世界按键大全...
  15. MySQL之SQL语句练习
  16. 基于javaweb的旅游管理系统(java+jsp+html5+bootstrap+servlet+mysql)
  17. 量子计算与量子信息之量子信息概述
  18. 心田花开:二年级语文阅读《黄山奇石》附答案解析
  19. GitBook 告别文档共享烦恼
  20. GS63风扇狂转CPU利用率100%PC电源方案设置

热门文章

  1. 如何把pdf翻译成中文?
  2. 2019.04流量副卡方案对比 - (日租卡类)月租在20元以下的
  3. 《蒋勋说宋词》 读后感
  4. 已解决:Component should be written as a pure functioneslintreact/prefer-stateless-fun报错
  5. 奇特的一生 柳比歇夫坚持56年的“时间统计法” - 读后感
  6. python学习(一)数据类型和运算符
  7. DDL和DML的含义
  8. 为你精选 · 地产行业数字化转型攻略
  9. [linux] maven
  10. 《西游记》中话“修行”【转】