Android APP在后台被杀问题修复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android APP在后台被杀问题修复相关的知识,希望对你有一定的参考价值。
参考技术A 目前项目采用单 Activity 模式,页面采用 Jetpack Navigation 导航
布局如下:Splash -> Home -> Detail
不做任何事情
持有 LiveData 类型变量 hasSDKInit,根据SDK初始化成功与否设置 true 或者 false
调用 SDK 实现相关功能。
很明显,被杀后与 Activity 生命周期关联的 ViewModel 也结束了,与新打开 APP 的区别是,这时候是没有通过 Splash 去 初始化 SDK 的, Home 直接调用一个没有初始化的SDK 实例当然就报错了。
这样我们把 SDK 的初始化挪到 Activity::onCreate 就行了。
Fragment 中通过``ViewModelProvider(requireActivity()).get(GlobalViewModel::class.java)`获取。
把 init SDK 放到 ViewModel 的构造函数中,并将 initSDK 方法私有化,不允许从外部调用
context 通过新建 ViewModelFactory 类传入。
Google 官方不推荐 ViewModel 持有任何形式的 Context,如果确实要用,可以考虑单例或者 AndroidViewModel
Splash 页面监听 hasSDKInit 逻辑不变。
Home 页面原有逻辑不变,必要时加上对 hasSDKInit 的监听,true 才可进行后续操作。
而,如果SDK 的 init 不依赖网络等其他因素,默认情况下因为所有调用都在主线程,那么 就不用做监听。
在 iOS4.x 中如何知道 app 即将被杀?
【中文标题】在 iOS4.x 中如何知道 app 即将被杀?【英文标题】:How to know app is about to kill in iOS4.x? 【发布时间】:2011-07-20 06:30:27 【问题描述】:我有一个在后台启用 locationServices 的应用程序。并且还有一些后台句柄代码。
我想要的是,当用户双击主页按钮并杀死我的应用程序时,我应该得到通知。没有每次调用的应用程序委托方法(100%)。虽然根据苹果的方法applicationWillTerminate:
将在终止应用程序时被调用,但在极少数情况下会被调用(100 次中有 5 次)。
有没有人对此有所了解?
【问题讨论】:
【参考方案1】:您是否考虑实现 applicationDidEnterBackground: 方法? The doc 说,“在 iOS 4.0 及更高版本中,当用户退出支持后台执行的应用程序时,会调用此方法而不是 applicationWillTerminate: 方法”。
【讨论】:
我在后台有一些任务,所以applicationDidEnterBackground
对我没有用处...当应用程序被杀死时,我只想关闭显着位置服务\【参考方案2】:
当使用 Home 键隐藏应用程序时,操作系统会将其挂起在内存中。发生这种情况时,会调用 applicationDidEnterBackground:
。如果此时系统决定它需要内存,它将启动关闭后台的应用程序。有时,您的应用会出现在“命中列表”中。当您的应用程序被杀死时,它会在调用 pplicationWillTerminate:
方法之后完全从内存中删除。该方法不会一直被调用,因为有时 iOS 需要内存,因此它实际上不会终止您的应用程序,而是会暂停它。
【讨论】:
【参考方案3】:嘿,我发现了一个非常好的观察结果,如果您的应用程序在后台运行一些代码并且用户试图杀死它,则调用 applicationWillTerminate
方法。
【讨论】:
以上是关于Android APP在后台被杀问题修复的主要内容,如果未能解决你的问题,请参考以下文章