如何解决无休止地运行前台服务将 Google Play 广告服务保留在内存中
TL DR
我有一个应用程序,它永远运行前台服务来监控电池(温度、电量等),记录这些数据并在超出某些限制时发送通知。由于我添加了广告,即使关闭应用程序并最终被杀死,正在运行的服务仍在使用大量内存,这使我的应用程序无用。我搜索了几个小时,找不到任何人报告类似的事情,所以我想我做错了什么。
我在底部导航视图中使用带有单个活动和多个片段的 MVVM 模式。在 MainActivity
中,onCreate() 初始化服务:
val serviceIntent = Intent(this,MyService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(serviceIntent)
} else {
startService(serviceIntent)
}
在MyService.kt
我打电话
override fun onStartCommand(intent: Intent,flags: Int,startId: Int): Int {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createNotificationChannels()
startForegroundForService()
} else {
startForeground(1,Notification())
}
return START_REDELIVER_INTENT
}
private fun startForegroundForService() {
val notificationBuilder = NotificationCompat.Builder(this,TEMP_NOTIFICATION_CHANNEL_ID)
val notification = notificationBuilder.setOngoing(false)
.setPriority(NotificationManager.IMPORTANCE_LOW)
.setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setOnlyAlertOnce(true)
.setContentIntent(resultPendingIntent)
.build()
startForeground(TEMP_NOTIFICATION_ID,notification)
}
如果应用被排除在电池优化之外,这工作正常并且服务会继续运行数天。使用的内存约为 50MB,因为我可以在“运行服务”中查看开发者选项。
当我在某些片段中添加横幅广告时,问题就开始了。在 MainActivity
中,我调用 MobileAds.initialize(this)
并在每个片段中调用以下代码:
private lateinit var mAdViewBanner: AdView
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
.....
mAdViewBanner = binding.adBanner
....
}
override fun onPause() {
super.onPause()
mAdViewBanner.pause()
}
override fun onDestroy() {
mAdViewBanner.destroy()
super.onDestroy()
}
override fun onResume() {
super.onResume()
mAdViewBanner.resume()
}
我添加了日志行来检查在浏览应用程序时是否调用了这些行,包括当应用程序通过后退按钮关闭时 MainActivity 中的 onDestroy。主片段在 MainActivity 之后被销毁,否则,我没有看到任何奇怪的行为。横幅广告被销毁(或者至少它们的实例被称为销毁)。
该服务通过 4 个进程继续运行,其中两个是 Google Play 服务。该应用程序的已用内存量约为 400MB(而不是预期的 50MB)。即使 30 分钟未打开应用程序,这些 Play 服务也不会停止。一段时间后,所有服务和进程都会被终止。
我找不到在关闭应用时删除这些 Google Play 服务的方法。应用在作为前台服务运行并关闭时不应使用如此大量的内存。
我尝试在单独的进程中运行该服务。这解决了高 RAM 量和 Play 服务的问题,但阻止了应用程序正常工作。当我调用应用程序存储库的服务写入操作时,不再写入 Room 数据库。 有没有其他方法可以做到这一点?我还没有尝试过 IPC,但我想这不会解决第一个问题,因为我必须继续为数据库运行第二个进程,以保持 Play 服务的运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。