Android APP一段时间无操作显示屏保
开发环境为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一段时间无操作显示屏保相关推荐
- android App一段时间没有操作或没有点击屏幕后弹出广告,或者一段时间没有点击屏幕进行特定操作。
android App没有操作一段时间后弹出屏保广告页面 最近做了个项目,里面有个功能是app在任何activity中没有操作一段时间后要跳转到屏保广告页面,点击广告页面是返回上一个activity中 ...
- android中屏保功能项目,【Android】一段时间不操作弹出【屏保】效果
仿屏保效果 最近项目的一个小Demo,和大家分享一下,本篇文章主要展示的是一个仿屏保的效果,用户在一段时间不操作会自动弹出屏保页面,当处于屏保页面的时候,[两秒内连续]按两次键盘[回车键]就会退出屏保 ...
- Android一段时间无操作之后,进入广告轮播界面,以及触摸之后停止轮播
想要的图片轮播Activity public class BannerMediaActivity extends AppCompatActivity implements View.OnClickLi ...
- putty连接centos/Ubuntu一段时间无操作无法输入 死机 断线解决办法
解决办法比较简单: PuTTY设置,putty -> Connection -> Seconds between keepalives ( 0 to turn off ),默认为0,改为5 ...
- MYSQL连接一段时间不操作后出现异常的解决方案
MYSQL连接一段时间不操作后出现异常的解决方案 参考文章: (1)MYSQL连接一段时间不操作后出现异常的解决方案 (2)https://www.cnblogs.com/bokejiayuan/p/ ...
- php到期自动过期,PHP实现页面长时间无操作,自动过期函数
PHP实现页面长时间无操作,自动过期函数 发布于 2015-01-13 19:55:41 | 878 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertex ...
- 解决终端SSH连接服务器一段时间不操作之后卡死的问题
解决终端SSH连接服务器一段时间不操作之后卡死的问题 参考文章: (1)解决终端SSH连接服务器一段时间不操作之后卡死的问题 (2)https://www.cnblogs.com/pandawan/p ...
- Android App 设置系统时间,语言和时区、系统重启
文章目录 说明 1. 修改系统时间 1. 设置系统时间(仅设置xx:xx) 2. 设置系统日期(仅设置到xxxx年xx月xx日) 3.设置系统是否自动获取时间 4.判断系统是否自动获取时间 2. 修改 ...
- mac一段时间不操作会死机
台式机mac一段时间不操作,就会界面卡死,只能移动鼠标,然后会自动重启. 解决办法: 关机,然后拔掉电源,15秒后重新接回电源. 5秒后重新开机.解决了.
最新文章
- 《C++面向对象高效编程(第2版)》——2.29 泛化关系(is-a)
- 优秀好文收录(持续更新...)
- 【Flutter】StatefulWidget 组件 ( FloatingActionButton 组件 | RefreshIndicator 组件 )
- MATLAB实现最优低通滤波器的函数
- C++ Primer 5th笔记(chap 15 OOP)构造函数和拷贝控制
- 使用VirtualAlloc在0x400000处申请内存
- [转载] 杜拉拉升职记——15 1001个笑话
- 普通用户nginx访问不了_Nginx降权启动之使用普通用户管理 | it运维_it技术_linux运维-追梦人博客...
- javascript 排序_JavaScript中的排序方法
- android图片压缩上传系列-基础篇
- PHP初入--表单元素
- 将Subversion(SVN)日志记录导出到excel表格(理论windows和Linux通用)
- 微型计算机系统与接口重要吗,微型计算机系统与接口 马宏锋 等编著 第六章
- domcer服务器按键显示怎么调,我的世界domcer怎么打开按键显示_我的世界按键大全...
- MySQL之SQL语句练习
- 基于javaweb的旅游管理系统(java+jsp+html5+bootstrap+servlet+mysql)
- 量子计算与量子信息之量子信息概述
- 心田花开:二年级语文阅读《黄山奇石》附答案解析
- GitBook 告别文档共享烦恼
- GS63风扇狂转CPU利用率100%PC电源方案设置
热门文章
- 如何把pdf翻译成中文?
- 2019.04流量副卡方案对比 - (日租卡类)月租在20元以下的
- 《蒋勋说宋词》 读后感
- 已解决:Component should be written as a pure functioneslintreact/prefer-stateless-fun报错
- 奇特的一生 柳比歇夫坚持56年的“时间统计法” - 读后感
- python学习(一)数据类型和运算符
- DDL和DML的含义
- 为你精选 · 地产行业数字化转型攻略
- [linux] maven
- 《西游记》中话“修行”【转】