Android Studio锁屏时保持网络连接,避免后台断网
Android后台持续保持网络连接的解决方案
1. 用前台服务提升进程优先级
Android锁屏后会严格限制后台资源,普通后台进程很容易被回收。前台服务能让进程处于高优先级状态,降低被系统杀死的概率,以此维持网络连接。
- 先在Manifest里声明权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <!-- Android 12+ 需额外声明对应类型权限 --> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTIVITY" /> - 实现前台服务类:
class NetworkKeepAliveService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { // 创建前台通知(必须显示,系统强制要求) val notification = NotificationCompat.Builder(this, "NETWORK_KEEP_ALIVE_CHANNEL") .setContentTitle("维持网络连接") .setContentText("应用后台保持网络活跃") .setSmallIcon(R.drawable.ic_notify_icon) .build() startForeground(1, notification) return START_STICKY } override fun onBind(intent: Intent): IBinder? = null } - 在需要时启动服务:
startService(Intent(this, NetworkKeepAliveService::class.java))
2. 使用唤醒锁防止设备深度睡眠
唤醒锁能让CPU保持活跃,避免设备进入深度睡眠后切断网络,但注意不要滥用,会增加耗电。
- 声明权限:
<uses-permission android:name="android.permission.WAKE_LOCK" /> - 获取并使用唤醒锁:
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp::NetworkWakeLock") wakeLock.acquire() // 按需设置超时,比如 wakeLock.acquire(3600000L) 表示1小时后自动释放 - 不用时务必释放:
wakeLock.release()
3. 优化网络请求配置
通过长连接和心跳包维持网络会话:
- 以OkHttp为例,配置连接池和超时,保持长连接:
val okHttpClient = OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS) .writeTimeout(30, TimeUnit.SECONDS) .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES)) .build() - 每隔几分钟发送一个极小的心跳请求(比如GET一个空接口),让服务器和设备都保持连接活跃。
4. 适配系统电池优化
引导用户把应用加入电池优化白名单,避免系统锁屏后限制应用的网络和进程:
- 检测并跳转至设置页面:
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager if (!powerManager.isIgnoringBatteryOptimizations(packageName)) { val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) intent.data = Uri.parse("package:$packageName") startActivity(intent) } - 注意:这个操作需要用户手动授权,要在应用里说明清楚为什么需要关闭电池优化,比如“为了保证后台实时数据同步,需要您将应用加入电池优化白名单”。
内容的提问来源于stack exchange,提问作者berumsu
相关产品推荐
相关产品推荐

