Android 无限期运行的前台服务将谷歌播放广告服务保留在内存中
TL DR 我有一个永远运行前台服务的应用程序来监控电池(温度、电量等),记录这些数据,并在超过某些限制时发送通知。由于我添加了广告,运行中的服务使用了大量内存,甚至在关闭应用程序后,最终被杀死,这使得我的应用程序毫无用处。我搜索了几个小时,没有发现任何人报告类似的事情,所以我猜我做错了什么Android 无限期运行的前台服务将谷歌播放广告服务保留在内存中,android,admob,google-play-services,Android,Admob,Google Play Services,TL DR 我有一个永远运行前台服务的应用程序来监控电池(温度、电量等),记录这些数据,并在超过某些限制时发送通知。由于我添加了广告,运行中的服务使用了大量内存,甚至在关闭应用程序后,最终被杀死,这使得我的应用程序毫无用处。我搜索了几个小时,没有发现任何人报告类似的事情,所以我猜我做错了什么 我使用MVVM模式,在底部导航视图中使用单个活动和多个片段。在MainActivity中,onCreate()初始化服务: val serviceIntent = Intent(this, MyServ
我使用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
I调用
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,我可以在“Running services”中查看开发者选项
问题开始于我在一些片段中添加横幅广告。在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。家庭碎片在主要活动后被销毁,否则,我没有看到任何奇怪的行为。横幅广告被销毁(或者至少它们的实例被调用以销毁)
该服务仍在运行4个进程,其中两个是Google Play服务。应用程序使用的内存量约为400MB(而不是预期的50MB)。这些播放服务不会停止,即使在30分钟后没有打开应用程序。一段时间后,所有服务和进程都被终止
在关闭应用程序时,我找不到删除这些Google Play服务的方法。当作为前台服务运行并关闭时,应用程序不应该使用如此大的内存
我尝试在单独的进程中运行该服务。这解决了高内存量和播放服务的问题,但使应用程序无法正常工作。当我将服务写入操作调用到应用程序存储库时,房间数据库不再被写入。
还有别的办法吗?我还没有尝试IPC,但我想这不会解决第一个问题,因为接下来我必须继续为数据库运行第二个进程,这可以让Play服务继续运行