- 71
- 0
前置条件:
- app在后台被kill,再次点击app能够恢复到之前的Activity执行onCreate(这是Android系统特性)
- 我们一般会自定义Application的onCreate中执行一些框架的初始化
场景:
打开app运行:Activity A -> Activity B -> Activity C,其中Activity C是一个本地相册,用的是图片加载框架ImageLoader,点击Home退到后台,过一段时间由于低内存app被kill,在最近打开中打开app,Activity C执行onCreate直接闪退。 原因:
E/uncaughtException: java.lang.IllegalStateException: ImageLoader must be init with configuration before using
像这样的问题还有很多,因为很多初始化需要放在Application的onCteate。 如何解决?
1
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
无就将法 普通会员 1楼
在Android应用程序中,如果后台被杀死并重新打开应用后,由于存在"应用程序退出"、"系统内存泄漏"等异常情况,可能引发Activity的崩溃。以下是可能的原因和解决方法:
- 应用程序退出:
- **已结束应用】
Activity和Fragment的生命周期管理不当,如未正确关闭资源或结束耗时操作。例如,Fragment在生命周期结束时没有清理内存,导致内存泄漏,导致应用在后台被杀死时无法重新启动。 - **恶意攻击或恶意软件】恶意应用可能通过非法手段阻止或终止您的应用程序的后台运行,例如通过阻止AndroidManifest.xml中的
android:exported属性设置为false,或者通过使用Thread.sleep()方法长时间运行耗时操作,导致应用在后台被杀死时无法重新启动。 -
系统内存泄漏:
- **系统内存泄露是Android 7.0(API Level 24)及以上版本引入的新问题。该版本引入了内存泄漏检测和修复机制,通过在Activity和Fragment生命周期中添加垃圾回收,可以检测和清理内存泄漏。如果没有正确清理内存,Android可能会在后台被杀死后导致应用崩溃。
- Java GC机制失效:在某些情况下,由于程序中出现大量临时对象或弱引用,可能导致内存泄漏。可以尝试手动释放不再需要的内存对象,或者使用垃圾回收工具(如
java.util.concurrent包下的GarbageCollector类)进行垃圾回收。
-
系统内存泄漏:
-
尝试清理缓存和数据集:
- 在Fragment或Activity中,如果涉及到持久化数据,如数据库连接、文件、本地存储等,可以尝试在
onDestroy()或onPause()方法中清理相关缓存和数据集,以释放系统内存。 - 定期清理垃圾文件:
- Android的垃圾回收机制默认在应用进入后台时进行,但用户可以选择在运行时进行内存清理,例如在
onCreate()方法中添加onTrimMemory()或onLowMemory()方法,这些方法会在应用进入后台时清理相关内存。
- 在Fragment或Activity中,如果涉及到持久化数据,如数据库连接、文件、本地存储等,可以尝试在
-
Android进程过载:
- **Android 5.0(API Level 16)以下版本,Android系统默认会根据内存空间自动关闭一些不需要的进程,如后台运行的Photos或Google Play Services等,这可能导致Activity在后台被杀死后无法重新启动。
-
系统资源消耗过大:
- 如果在应用中存在高耗能的操作,如图片加载、视频播放、数据库查询等,可能导致系统资源耗尽,导致应用在后台被杀死后无法重新启动。
- 应用程序服务过载:
- 如果在应用中存在大量依赖于网络的后台服务,如天气应用的天气查询、地图应用的定位服务等,可能导致应用程序服务过载,导致系统资源耗尽,进而导致Activity在后台被杀死后无法重新启动。
-
权限问题:
- 如果在后台运行的活动中,需要某些权限,如读取联系人、访问位置等,但没有正确申请或设置权限,可能导致Activity在后台被杀死后无法重新启动。
- 使用系统的销毁机制:
- 在Android 5.0(API Level 16)及更高版本中,系统默认会在应用进入后台时销毁所有不必要的系统资源,包括应用、后台进程和任务,但有些应用程序可能使用了系统的销毁机制,导致Activity在后台被杀死后无法重新启动。
为了预防和解决这些问题,可以遵循以下建议:
- 遵循Android开发最佳实践,例如在生命周期中正确关闭资源、释放内存、设置垃圾回收参数等,以减少内存泄漏风险。
- 定期进行内存泄漏检测和修复,使用垃圾回收工具或手动清理内存,确保Activity在后台运行时内存充足。
- 限制应用中高耗能的操作,例如只在必要时使用网络服务,避免长时间等待加载数据或网络请求。
- 合理使用应用程序服务,避免过度依赖于特定服务,尽可能选择依赖于网络的轻量级服务,以减少系统资源消耗。
- 使用权限管理,确保在需要时申请和设置必要的权限,避免因权限冲突导致Activity在后台被杀死后无法重新启动。
- 定期清理应用程序缓存和数据集,确保数据的正确性,避免数据错误导致的Activity崩溃。
通过遵循上述建议,可以有效避免Activity在后台被杀死后无法重新启动的问题,确保应用程序的稳定性和用户体验。如果在应用中频繁出现上述问题,建议进行更深入的代码审查和性能测试,找出并修复可能存在的问题。
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
