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)