自定义android程序一段时间无操作后的功能
项目中遇见一个这样的需求,就是当软件在一定时间没有操作时候需要弹出广告页面,当点击广告页面时又进行软件操作,也就是广告要在软件打开并且处于未操作状态才会出来。
方法一:用handler+onTouchEvent实现延时发送请求
这个操作最好放到BaseActivity里进行。
[代码]java代码:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | privateHandler handler = newHandler();privatelongtime=1000*60*5;@OverridepublicbooleanonTouchEvent(MotionEvent event) {    switch(event.getAction()) {        caseMotionEvent.ACTION_DOWN:            handler.removeCallbacks(runnable);            break;        caseMotionEvent.ACTION_UP:            startAD();            break;    }    returnsuper.onTouchEvent(event);}privateRunnable runnable = newRunnable() {    @Override    publicvoidrun() {       跳转到广告页面    }};publicvoidstartAD() {    handler.removeCallbacks(runnable);    handler.postDelayed(runnable, time);} | 
方法二:通过PowerManager.WakeLock实现
判断屏幕是否变暗的这个思路去实现。
方法三:使用双线程来实现 (时间超时或者在接收到锁屏广播的时候显示)
可以在application或者activity的oncreated方法里面启动监听。
[代码]java代码:
| 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | publicclassMainActivity extendsActivity {        privateHandler mHandler01 = newHandler();      privateHandler mHandler02 = newHandler();            /* 上一次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;            @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          ((Button)findViewById(R.id.start_screen_Saver)).setOnClickListener(new View.OnClickListener() {                            @Override              public void onClick(View v) {                  // TODO Auto-generated method stub                  Intent 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() {                    @Override          public 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() {            @Override          public void run() {              // TODO Auto-generated method stub              if (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);                }            @Override      public 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());      }            @Override      protected void onResume() {          /*activity显示的时候启动线程*/          mHandler01.postAtTime(mTask01, intervalKeypadeSaver);          super.onResume();      }            @Override      protected void onPause() {          /*activity不可见的时候取消线程*/        mHandler01.removeCallbacks(mTask01);          mHandler02.removeCallbacks(mTask02);          super.onPause();      }        } | 
下面是启动一个服务,当用户按锁屏键锁屏的时候会发送一个广播,我们在服务中接受到广播后可以屏蔽系统的锁屏,显示我们自己的锁屏:
[代码]java代码:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | publicclassScreenService extendsService {      KeyguardManager mKeyguardManager = null;         privateKeyguardLock mKeyguardLock = null;        BroadcastReceiver mMasterResetReciever;      @Override    publicIBinder onBind(Intent intent) {          // TODO Auto-generated method stub          returnnull;      }       @Override        publicvoidonCreate() {                //Log.e("ScreenService","onCreate()");              // TODO Auto-generated method stub               startScreenService();              super.onCreate();               }                    @Override     publicvoidonStart(Intent intent, intstartId) {            // Log.e("ScreenService","onStart");          // TODO Auto-generated method stub              startScreenService();        }                  privatevoidstartScreenService(){           mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);              mKeyguardLock = mKeyguardManager.newKeyguardLock("");                                 mKeyguardLock.disableKeyguard();                         //Intent.ACTION_SCREEN_OFF           mMasterResetReciever = newBroadcastReceiver() {                  @Override                publicvoidonReceive(Context context, Intent intent) {                      try{                            Intent i = newIntent();                              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, newIntentFilter(Intent.ACTION_SCREEN_OFF));          }              @Override    publicvoidonDestroy() {          //Log.e("ScreenService","onDestroy()");          super.onDestroy();          unregisterReceiver(mMasterResetReciever);             ScreenService.this.stopSelf();       }  } | 
自定义android程序一段时间无操作后的功能的更多相关文章
- ssh一段时间无操作后自动断开连接(假死)问题
		平时使用ssh远程服务器的时候(注:远程虚拟机一般不会有这个问题),一段时间没有操作,ssh连接就会处于假死状态,以至于需要重新进行ssh连接,不管你用的什么远程工具都会出现这个问题,那么通过心跳检测 ... 
- Web页面长时间无操作后再获取焦点时转到登录界面
		今天开始讲新浪博客搬到博客园. 在工作中遇到的小问题,感觉有点意思,就记录下来吧! 该问题分为两种情况,一.Web页面长时间无操作后,在对其进行操作,比如点击“首页”.“设 ... 
- Android关于界面一定时间无操作自动跳转到指定界面的实现
		主要用到的功能,自定义一个定时器CountTimer继承CountDownTimer. public class CountTimer extends CountDownTimer { private ... 
- MYSQL连接一段时间不操作后出现异常的解决方案
		最近做的网站使用的是MYSQL数据库 发现 果超过8小时应用程序不去访问数据库,数据库就断掉连接 .这时再次访问就会抛出异常,如下所示: com.mysql.jdbc.exceptions.jdbc4 ... 
- ECSHOP后台登陆后一段时间不操作就超时的解决方法
		ECSHOP后台登陆后一段时间不操作就超时的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2012-05-27 客户生意比较好,因此比较忙,常常不在电脑前 ... 
- 解决linux一段时间不操作失去连接的问题
		解决mac下ssh空闲一段时间自动断开的问题 http://www.haorooms.com/post/mac_iterm2_ssh 问题现象 用 ssh 命令连接服务器之后,如果一段时间不操作,再次 ... 
- WPF:鼠标长时间无操作,窗口隐藏
		//设置鼠标长时间无操作计时器 private System.Timers.Timer MouseTimerTick = new System.Timers.Timer(10000); private ... 
- delphi中我用定时器每隔一段时间执行操作
		delphi中,我用定时器每隔一段时间执行数据库插入及更新工作!adoquery.close;adoquery.sql.cleare;adoquery.connection:=con1;adoquer ... 
- 解决终端SSH连接服务器一段时间不操作之后卡死的问题
		卡死是因为LIUNX安全设置问题,在一段时间内没有使用数据的情况下会自动断开,解决方法就是让本地或者服务器隔一段时间发送一个请求给对方即可 在本地打开配置文件(不建议在server端设置) sudo ... 
随机推荐
- sql 字段重复值,in,like
- iOS 开发之重力动画效果
			步骤:1.使用single view application创建新的项目 2.在viewcontroller.h文件中创建一个图片实例并与相关图片相连,然后创建一个UIDynamicAnimator ... 
- 【LeetCode】Best Time to Buy and Sell Stock IV
			Best Time to Buy and Sell Stock IV Say you have an array for which the ith element is the price of a ... 
- 测试题1 IOS面试基础题
			免责声明:答案来自本人,错误之处敬请谅解 1.用变量a写出以下定义 a.一个整型数 int a=5; b.一个指向整型数的指针 int *a; c.一个指向指针的指针,它指向的指针是指向一个整 ... 
- HDU 3351
			http://acm.hdu.edu.cn/showproblem.php?pid=3351 乍一看很像经典的括号匹配问题,其实不然,因为操作并非增加括号,而是翻转括号 只需记录多余的左括号的数量即可 ... 
- HDU 4704
			http://acm.hdu.edu.cn/showproblem.php?pid=4704 求(2^n)%mod的方法 #include <iostream> #include < ... 
- [SYSU]每周一赛
			2014年每周一赛第一场 A.Cutting Sausages B.Rectangular Fields //待做 ... 
- yii表单
			yii 的dropdownlist,用yii的session可以记下选中的状态 $form = $this->beginWidget('CActiveForm',array('action'= ... 
- Array操作方法和String操作方法比较
			Array 的操作方法和 String 的操作方法老是弄混>_<,下面就对于这两个对象的常用操作方法进行比较~~ Array ☞ 操作方法 concat():returns a new a ... 
- 织梦dedecms 用交叉栏目时arclist标签调用不出内容文章的问题(纯转载)
			本文转自:http://www.cnblogs.com/cnteam/articles/4056702.html 最近用了交叉栏目发现当为手动指定交叉栏目ID时用arclist标签不能调出相关文章最后 ... 
