Android有时会强制杀死应用程序
Posted
技术标签:
【中文标题】Android有时会强制杀死应用程序【英文标题】:Android sometimes force kills application 【发布时间】:2016-05-12 22:18:31 【问题描述】:我开始活动 A,然后开始活动 B。 我按主页按钮,然后等待很长时间。 当我恢复应用程序时,它强制停止。
02-03 18:42:54.413 828-844/system_process I/ActivityManager: Force stopping ru.tabor.search appid=10089 user=0: from pid 20405
02-03 18:42:54.414 828-844/system_process I/ActivityManager: Killing 30212:ru.tabor.search/u0a89 (adj 7): stop ru.tabor.search
02-03 18:42:54.445 828-5948/system_process I/WindowState: WIN DEATH: Window18b92c9b u0 ru.tabor.search/ru.tabor.search.modules.authorization.AuthorizationActivity
02-03 18:42:54.447 828-845/system_process I/WindowState: WIN DEATH: Window1cd0cfe4 u0 ru.tabor.search/ru.tabor.search.modules.registration.RegistrationActivity
02-03 18:42:54.519 828-844/system_process I/ActivityManager: Force finishing activity 3 ActivityRecord25a8977f u0 ru.tabor.search/.modules.authorization.AuthorizationActivity t2593
02-03 18:42:54.520 828-844/system_process I/ActivityManager: Force finishing activity 3 ActivityRecordd516838 u0 ru.tabor.search/.modules.registration.RegistrationActivity t2593
02-03 18:42:54.523 828-20666/system_process W/ActivityManager: Spurious death for ProcessRecord21ff313b 0:ru.tabor.search/u0a89, curProc for 30212: null
02-03 18:42:59.890 828-1247/system_process I/ActivityManager: START u0 act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10100000 cmp=ru.tabor.search/.modules.authorization.AuthorizationActivity from uid 10089 on display 0
02-03 18:42:59.903 828-1247/system_process V/WindowManager: addAppToken: AppWindowToken1c4987a0 token=Token279a08a3 ActivityRecord9f5afd2 u0 ru.tabor.search/.modules.authorization.AuthorizationActivity t2593 to stack=1 task=2593 at 0
02-03 18:42:59.919 828-891/system_process V/WindowManager: Adding window Window1735e91b u0 Starting ru.tabor.search at 4 of 8 (after Window2ab6bf53 u0 com.cleanmaster.mguard/com.keniu.security.main.MainActivity)
02-03 18:43:19.288 828-1673/system_process I/ActivityManager: Start proc 21366:ru.tabor.search/u0a89 for activity ru.tabor.search/.modules.authorization.AuthorizationActivity
如何解决?
【问题讨论】:
欢迎使用安卓。也许:***.com/questions/13009499/win-death-error-in-android 日志中有异常吗? 我没有任何例外。这很奇怪。 你能在这里分享你的代码吗? 如果使用edittext创建hello world项目,使用freemem app后会出现bug(模拟低内存行为)。 【参考方案1】:您是否将某些内容作为 Intent extra 传递给活动? 如果没有,请尝试从您的设备中删除干净的主。
【讨论】:
删除干净的master后问题依旧存在。 你是否在活动意图上传递了一些额外的东西? 我没有传递额外的东西。 您的应用中是否启用了 StrictMode?span> 【参考方案2】:您的应用程序泄漏了吗?如果手机内存不足,它将杀死内存猪应用程序。如果有进程在这些活动上运行,则将其转移到服务并在 oncreate 中调用 startForeground()。
【讨论】:
我的 Activity 杀死自己(或 ActivityManager 杀死 Activity),并丢失输入数据。 然后按照 Smartiz 上面的回答进行操作【参考方案3】:Recreating an Activity 说:
如果当前已停止,系统也可能会破坏您的活动 并且长时间没有使用或者前台活动 需要更多资源,因此系统必须关闭后台 恢复内存的进程。
所以你不能阻止系统杀死你的应用程序。
要克服它,您应该重写 onRestoreInstanceState 方法。在这种情况下,您可以在系统终止活动时保存活动状态,然后在导航回此活动时恢复。
另一种选择是实现自己的IntentService。
引用自Services API 指南:
Android 系统只有在内存不足时才会强制停止服务 它必须为有用户的活动恢复系统资源 重点。
【讨论】:
我花了很长时间才发现这是我的片段重叠的原因。重新创建应用程序时,活动 X 创建一个默认片段并恢复另一个片段......只是一团糟。如果 savedInstanceState != null 打开正确的片段,我必须检查活动 X。并更改片段以仅在 onCreateView 上使用 findViewById。当我让他 onCreate 时,这种情况会产生 NullPointerException :|【参考方案4】:据我所知,您对此无能为力! 这就是android垃圾回收系统的行为!
我记得,android 自己做垃圾收集,如果你在后台长时间不使用活动,它会被系统收集垃圾,以便为其他应用程序和进程腾出内存。
如果您想保留该活动中的任何信息,请将其保存在这里;
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
super.onSaveInstanceState(outState, outPersistentState);
当你回到那个活动时,
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
if(savedInstanceState!=null)
// GET #savedInstanceState AND USE THE OBJECT YOU STORED
这就是你所能做的。
【讨论】:
使用空包调用 onCreate 方法。 我编辑了我的答案。第一次进入活动时它是空的,所以你必须进行空检查。【参考方案5】:您的应用程序很可能由于内存过载而被 android OS 杀死,或者可能存在某种情况下您的主线程中正在运行某种进程,您需要检查它。同时覆盖 OnResume 函数并检查您的结果是什么得到。
【讨论】:
【参考方案6】:显然,Android 内存有限,因此虚拟机可以删除任何可能不必要的代码。
查看 Activity 生命周期 方法,特别是 onResume
并确保您完全理解。很多时候应用程序崩溃只是因为不当使用 Activity 生命周期的方法。
另一个重要的部分是 Activity 的设计考虑因素是,无论持久性数据发生什么情况,您的 Activity 都应该使用一些默认值显示其 UI。所以假设是这样的,如果我有数据我会显示,如果我没有,我真的不在乎。 无论有没有数据,您的用户界面都不应崩溃。您可以使用Resources,例如String.xml
、dimens.xml
来存储一些默认值,甚至在布局中。
如果您仍然想使用单例类,这很好,但请确保每次尝试访问单例时都进行以下检查。
if (instance==null)
instance=CurrentActivity.getInstance()
getInstance()
方法不仅会返回您当前的实例,还会确保
不要静态地从一个 Activity 访问数据到另一个。对于您现在面临的类型问题,这对 android 来说并不好,而且它也不是很好的 OOP 编程实践。
我推荐了SharedPreference。如果满足您的要求,那么保存数据的更好方法就可以了。
如果您想从不同的 Android 组件(如 Activity、Service 或 BroadcastReciever)传递数据,您可以将其放入包中并作为意图发送。而且,它们一如既往地是 SQLLite 数据存储、文件 IO 等。
希望这会对你有所帮助。
【讨论】:
【参考方案7】:我知道这个问题已经很老了,但对于那些仍在寻找答案的人,请尝试从 Android 设置中为您的特定应用关闭电池优化和打盹模式。这应该可以。
【讨论】:
以上是关于Android有时会强制杀死应用程序的主要内容,如果未能解决你的问题,请参考以下文章
Android,如何使应用程序的任务不可关闭?只能通过任务杀死关闭
2023年Android黑科技保活方案,应用永生,拒绝强制杀死 最高适配Android 13 小米 华为 Oppo vivo 等最新机型 拒绝强杀 开机自启动 附demo apk 附研究资料