如何实现每次设备联网时自动触发WorkManager执行服务器同步任务
可行实现方案
你可以组合使用系统网络状态监听 + WorkManager 实现每次联网触发同步的需求,不需要依赖已废弃的Firebase JobScheduler,具体实现如下:
方案核心逻辑
原有3小时周期的PeriodicWorkRequest可以保留作为兜底同步机制,额外新增网络连接事件的实时监听,每次监听到联网事件时主动触发一次同步任务,就能覆盖两次周期间临时联网的场景。
具体实现步骤
- 首先在应用全局(比如Application类)动态注册
ConnectivityManager.NetworkCallback监听网络状态,安卓7.0及以上版本不再支持静态注册联网广播,必须用动态注册的回调实现监听:
// 先声明网络回调 val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) // 网络连接成功,触发同步任务 triggerSyncWork() } } // 在Application onCreate中注册回调 val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.registerDefaultNetworkCallback(networkCallback)
- 实现
triggerSyncWork方法,入队一次性Work任务,同时做去重处理避免短时间多次触发:
private fun triggerSyncWork() { val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) .build() val syncWork = OneTimeWorkRequestBuilder<ExampleWorker>() .setConstraints(constraints) .build() WorkManager.getInstance(context) .enqueueUniqueWork( "one_time_sync_tag", ExistingWorkPolicy.KEEP, // 已有相同任务在队列时不重复入队 syncWork ) }
注意事项
- 如果应用需要在后台也能收到联网事件,可酌情申请后台运行权限,但要符合各厂商的后台保活规则,避免被系统查杀。
- 同步逻辑如果有幂等性要求,记得在
ExampleWorker中做重复请求的校验,避免数据重复提交。
内容的提问来源于stack exchange,提问作者Moiz Hassan Khan
相关产品推荐
相关产品推荐

