Android 无限期运行的前台服务将谷歌播放广告服务保留在内存中

Android 无限期运行的前台服务将谷歌播放广告服务保留在内存中,android,admob,google-play-services,Android,Admob,Google Play Services,TL DR 我有一个永远运行前台服务的应用程序来监控电池(温度、电量等),记录这些数据,并在超过某些限制时发送通知。由于我添加了广告,运行中的服务使用了大量内存,甚至在关闭应用程序后,最终被杀死,这使得我的应用程序毫无用处。我搜索了几个小时,没有发现任何人报告类似的事情,所以我猜我做错了什么 我使用MVVM模式,在底部导航视图中使用单个活动和多个片段。在MainActivity中,onCreate()初始化服务: val serviceIntent = Intent(this, MyServ

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
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服务继续运行