定时任务问题
Android手机应用,通过定时器发送HTTP心跳请求,在手机息屏后,出现间隔时间不准确的问题。如果按下电源键,点亮屏幕后,间隔可以恢复正常。定时器使用TimerTask或Thread.sleep都存在此现象。分析原因,与Android 6.0(API 级别 23)开始,Android 引入了两项省电功能有关。
解决方法1
保持手机屏幕常亮,比较费电,不太可行。
解决方法2
设置应用权限,省电策略选择:不限制
示例代码
在AndroidManifest.xml文件,申请电池免优化权限
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
public class NotificationService extends NotificationListenerService {
private PowerManager.WakeLock mWakeLock = null;
private Timer timer;
private Handler handler;
/**
* 当连接成功时调用
*/
@Override
public void onListenerConnected() {
handler = new Handler(Looper.getMainLooper());
timer = new Timer();
// 开启心跳检测
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
sendHeart();
}
};
timer.schedule(timerTask, 0, 30*1000); // 每隔30秒发送一次HTTP请求
handler.post(new Runnable(){
public void run(){
Toast.makeText(getApplicationContext() ,"监听服务开启成功!",Toast.LENGTH_SHORT).show();
}
});
}
/**
* 心跳请求
*/
public void sendHeart(){
Log.d(TAG, "心跳检测开始..");
//发送HTTP请求
}
}
通过方法2设置,定时器任务执行的间隔时间已经正常。