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.xmldimens.xml 来存储一些默认值,甚至在布局中。

如果您仍然想使用单例类,这很好,但请确保每次尝试访问单例时都进行以下检查。

if (instance==null)
    instance=CurrentActivity.getInstance()

getInstance() 方法不仅会返回您当前的实例,还会确保

它初始化所有对象和变量 作为实例方法的其他单例方法

不要静态地从一个 Activity 访问数据到另一个。对于您现在面临的类型问题,这对 android 来说并不好,而且它也不是很好的 OOP 编程实践。

我推荐了SharedPreference。如果满足您的要求,那么保存数据的更好方法就可以了。

如果您想从不同的 Android 组件(如 Activity、Service 或 BroadcastReciever)传递数据,您可以将其放入包中并作为意图发送。而且,它们一如既往地是 SQLLite 数据存储、文件 IO 等。

希望这会对你有所帮助。

【讨论】:

【参考方案7】:

我知道这个问题已经很老了,但对于那些仍在寻找答案的人,请尝试从 Android 设置中为您的特定应用关闭电池优化和打盹模式。这应该可以。

【讨论】:

以上是关于Android有时会强制杀死应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Android杀死应用方法总结

Android,如何使应用程序的任务不可关闭?只能通过任务杀死关闭

Android 怎么退出整个应用程序

Android可以彻底杀死一个进程吗

2023年Android黑科技保活方案,应用永生,拒绝强制杀死 最高适配Android 13 小米 华为 Oppo vivo 等最新机型 拒绝强杀 开机自启动 附demo apk 附研究资料

android 模拟应用因内存不足被后台杀死命令