项目中遇见一个这样的需求,就是当软件在一定时间没有操作时候需要弹出广告页面,当点击广告页面时又进行软件操作,也就是广告要在软件打开并且处于未操作状态才会出来。

方法一:用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
private Handler handler = new Handler();
private long time=1000*60*5;
@Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            handler.removeCallbacks(runnable);
            break;
        case MotionEvent.ACTION_UP:
            startAD();
            break;
    }
    return super.onTouchEvent(event);
}
private Runnable runnable = new Runnable() {
    @Override
    public void run() {
       跳转到广告页面
    }
};
public void startAD() {
    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
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; 
       
    @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
public class ScreenService extends Service { 
    KeyguardManager mKeyguardManager = null;    
    private KeyguardLock mKeyguardLock = null;   
    BroadcastReceiver mMasterResetReciever; 
    @Override 
    public IBinder onBind(Intent intent) { 
        // TODO Auto-generated method stub 
        return 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_OFF 
         mMasterResetReciever = new BroadcastReceiver() {    
             @Override 
                public 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));    
     
        
     @Override 
    public void onDestroy() { 
        //Log.e("ScreenService","onDestroy()"); 
        super.onDestroy(); 
        unregisterReceiver(mMasterResetReciever);   
         ScreenService.this.stopSelf(); 
     
}

自定义android程序一段时间无操作后的功能的更多相关文章

  1. ssh一段时间无操作后自动断开连接(假死)问题

    平时使用ssh远程服务器的时候(注:远程虚拟机一般不会有这个问题),一段时间没有操作,ssh连接就会处于假死状态,以至于需要重新进行ssh连接,不管你用的什么远程工具都会出现这个问题,那么通过心跳检测 ...

  2. Web页面长时间无操作后再获取焦点时转到登录界面

    今天开始讲新浪博客搬到博客园.        在工作中遇到的小问题,感觉有点意思,就记录下来吧!        该问题分为两种情况,一.Web页面长时间无操作后,在对其进行操作,比如点击“首页”.“设 ...

  3. Android关于界面一定时间无操作自动跳转到指定界面的实现

    主要用到的功能,自定义一个定时器CountTimer继承CountDownTimer. public class CountTimer extends CountDownTimer { private ...

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

    最近做的网站使用的是MYSQL数据库 发现 果超过8小时应用程序不去访问数据库,数据库就断掉连接 .这时再次访问就会抛出异常,如下所示: com.mysql.jdbc.exceptions.jdbc4 ...

  5. ECSHOP后台登陆后一段时间不操作就超时的解决方法

    ECSHOP后台登陆后一段时间不操作就超时的解决方法 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2012-05-27   客户生意比较好,因此比较忙,常常不在电脑前 ...

  6. 解决linux一段时间不操作失去连接的问题

    解决mac下ssh空闲一段时间自动断开的问题 http://www.haorooms.com/post/mac_iterm2_ssh 问题现象 用 ssh 命令连接服务器之后,如果一段时间不操作,再次 ...

  7. WPF:鼠标长时间无操作,窗口隐藏

    //设置鼠标长时间无操作计时器 private System.Timers.Timer MouseTimerTick = new System.Timers.Timer(10000); private ...

  8. delphi中我用定时器每隔一段时间执行操作

    delphi中,我用定时器每隔一段时间执行数据库插入及更新工作!adoquery.close;adoquery.sql.cleare;adoquery.connection:=con1;adoquer ...

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

    卡死是因为LIUNX安全设置问题,在一段时间内没有使用数据的情况下会自动断开,解决方法就是让本地或者服务器隔一段时间发送一个请求给对方即可 在本地打开配置文件(不建议在server端设置) sudo ...

随机推荐

  1. (转)HTML5开发学习(3):本地存储之Web Sql Database

    原文:http://www.cnblogs.com/xumingxiang/archive/2012/03/25/2416386.html HTML5开发学习(3):本地存储之Web Sql Data ...

  2. (spring-第12回【IoC基础篇】)JavaBean的属性编辑器

    在spring实例化bean的最后阶段,spring利用属性编辑器将配置文件中的文本配置值转换为bean属性的对应值,例如: 代码0011 <bean id="car" cl ...

  3. 迪士尼黑科技:爬墙机器人 VertiGo

    12 月 30 日,迪士尼研发出的一款爬墙机器人曝光了一段有趣的视频.从视频里可看出这个机器人碰到墙壁时迅速地作出反应爬了上去. 据了解,这个爬墙机器人名叫 VertiGo,由迪士尼研究中心和苏黎世联 ...

  4. IOS创建目录接口createDirectoryAtPath:withIntermediateDirectories:中参数attributes的设置

    在应用程序执行时,经常需要本地化保存一些重要的数据,这时就有可能需要创建一些目录.Objective-C提供了一个非常强大的创建目录的接口: - (BOOL)createDirectoryAtPath ...

  5. C++读入二进制数并转换为十进制输出

    题目描述 已知一个只包含0和1的二进制数,长度不大于10,将其转换为十进制并输出. 输入描述 输入一个二进制整数n,其长度不大于10 输出描述 输出转换后的十进制数,占一行 样例输入 样例输出 sol ...

  6. 【LEETCODE OJ】Single Number

    Prolbem link: http://oj.leetcode.com/problems/single-number/ This prolbem can be solved by using XOR ...

  7. 配置PhoneGap 到iOS

    下载 phonegap安装phonegap之前需要NodeJS环境,下载NodeJS并安装.安装环境的目的是为了使用phonegap命令行. 3. 安装phonegap使用命令    $phonega ...

  8. HDU 3791

    http://acm.hdu.edu.cn/showproblem.php?pid=3791 建立二叉树,对比是否相同 #include <iostream> #include <c ...

  9. MySQL 字符集设置

    /*************************************************************************** * MySQL 字符集设置 * 说明: * 数 ...

  10. php-抽象

    //继承//子类可以继承父类的一切//特点:单继承//函数的重写 //多态//当父类引用指向子类实例,由于子类对父类的方法进行了重写,父类引用在调用该方法的时候表现出的不同//如果一个方法需要一个父类 ...