微信公众号

Android后台发心跳请求 定时器间隔不准问题

定时任务问题

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设置,定时器任务执行的间隔时间已经正常。

Ubuntu 24.04 LTS 即将发布,有哪些新特性 JDK 21新特性有哪些
微信公众号