Android APP的某个页面 ,隔一段时间做什么

1.  在APP的某个页面 ,隔一段时间做什么(操作重置) 

https://blog.csdn.net/qq1137830424/article/details/52651011

activity -----------------

    private Screensaver mScreensaver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mScreensaver = new Screensaver(5000); //定时5秒
        mScreensaver.setOnTimeOutListener(this); //监听
        mScreensaver.start(); //开始计时
    }

    /**
     * 当触摸就会执行此方法
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        mScreensaver.resetTime(); //重置时间
        return super.dispatchTouchEvent(ev);
    }
    //如果监听不是这么严密,只是单纯的在 onpuse  onstart onstop 中监听处理也可以
    /**
     * 当使用键盘就会执行此方法
     */
    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        mScreensaver.resetTime(); //重置时间
        return super.dispatchKeyEvent(event);
    }

    /**
     * 时间到就会执行此方法
     */
    @Override
    public void onTimeOut(Screensaver screensaver) {
        Log.d("MainActivity", "时间到了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mScreensaver.stop(); //停止计时
    }


Screensaver------

    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 OnTimeOutListener mOnTimeOutListener;
    private int mScreensaverTiemout = DEFAULT_TIMEOUT;//默认为3分钟

    private Handler mHandler = 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() {
        //Message message = mHandler.obtainMessage(MSG_TIMEOUT); //包装消息
        //mHandler.sendMessageDelayed(message, mScreensaverTiemout); //延时发送消息

修改成 alarmManager.setExactAndAllowWhileIdle();  handler 和massgae会休眠导致无法正常
    }

    /**
     * 停止计时
     */
    public void stop() {
        mHandler.removeMessages(MSG_TIMEOUT); //移除消息
    }

    /**
     * 重置时间
     */
    public void resetTime() {
        stop();
        start();
    }

    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. 在APP的整个周期,隔一段时间做什么(操作重置 , service )

启动 service 进行操作

3. 服务APP,隔一段时间做什么(操作重置)

类似锁屏apk

4.   利用 AlarmManager 设置好时间 -- 连接丢失了

Intent intent = new Intent(getApplicationContext(), AlarmBroadcastReciver.class);    
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0,            
intent, PendingIntent.FLAG_UPDATE_CURRENT);    
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);


这里要说一下关于AlarmManager的几个重要方法!
[这篇文章介绍的比较详细,感谢作者](http://www.runoob.com/w3cnote/android-tutorial-alarmmanager.html)

`set(int type, long triggerAtMillis, PendingIntent operation)`
这个方法是本次使用到的方法之一,用于在特定时间传递一个广播,但是只能单次提醒,它的参数说明:
**第一个参数是指AlarmManager的类型**,有5个值可以选择:`AlarmManager.ELAPSED_REALTIME` 闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始);

`AlarmManager.ELAPSED_REALTIME_WAKEUP `闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间; 
`AlarmManager.RTC `闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间(即当前系统时间);
`AlarmManager.RTC_WAKEUP` 表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间; 
`AlarmManager.POWER_OFF_WAKEUP `表示闹钟在手机关机状态下也能正常进行提示

**第二个参数是指开启提示的时间**
**第三个参数是绑定了需要执行的操作**,比如这次采用的发送广播,也可以弹出提示框等等

`setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)`
这个方法和上一个类似,就是多了一个参数`long intervalMillis`,这个方法是可以重复执行提醒功能,而多出的这个参数就是重复提醒之间的时间间隔

`cancel(PendingIntent operation)`
这个方法从名字就可以看出来,是用来取消提醒的


  设置广播接收器
  注意1中的这一行代码 
  Intent intent = new Intent(getApplicationContext(), AlarmBroadcastReciver.class); 
  这行代码就是利用Intent直接指定广播接收器,这样就不需要在清单文件中注册具体的广播标签,该广播接收器接受到广播时,会直接执行关机操作


public void onReceive(Context context, Intent intent) {   

Toast.makeText(context,"关机啦", Toast.LENGTH_SHORT).show();    

try {       

  Process process = Runtime.getRuntime().exec("su");       
  DataOutputStream out = new DataOutputStream(               

  process.getOutputStream());       
  out.writeBytes("reboot -p\n");       
  out.writeBytes("exit\n");        
  out.flush();    

} catch (IOException e) {   

   e.printStackTrace();  

}

一些bug的更改及遗漏问题放在[Android定时关机问题解决](http://www.jianshu.com/p/da37562f1111)

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值