Android长时间后台运行,内存被回收再次打开导致APP崩溃(APP在后台被系统回收后,如何重新启动?)

当Android系统因内存不足回收APP时,再次打开可能导致崩溃。原因是Application被回收,全局变量丢失。解决方案包括利用onSaveInstanceState和OnRestoreInstanceState保存状态,或在Activity启动前检查APP是否被回收并采取相应措施。可以通过设置MainActivity为singletask模式或清空任务栈实现APP重启。此外,可以监控内存回收并在BaseActivity中初始化全局变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

因为手机内存不足的时候,会回收一些APP所占内存,如果被回收的APP中有全局变量,那么再次进入这个APP就会导致异常报错;

原因:

因为Application是全局变量,内存不足的时候会被回收,这个时候如果不是重启而是恢复之前页面,系统会重新new一个Application,所以没有回收之前保存在Application中的信息都将没有了,所以回收之前保存在Application中的信息都将没有了,这个时候被恢复的页面就可能因为需要Application中的信息报NullPointerException错;

        这说明:系统回收APP后,再次进入此软件,Android只是恢复这个应用,并不是重启,他会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个APP从来没有被kill掉的假象;

什么是应用程序?

Application和Activity,Service一样是android框架的一个系统组件,当android程序启动时系统会创建一个Application对象,用来存储系统的一些信息。通常我们是不需要指定一个Application的,这时系统会自动帮我们创建,如何创建自己的Application,也可以简单创建一个类继承Application并在manifest的application标签中进行注册(只需要给Application标签增加个name属性把自己的Application名字注入即可)。

android系统会为每个程序运行创建一个Application类对象且仅创建一个,所有Application可以说是单例(singleton)模式的一个类,且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局单例的,所以不同Activity,Service中获取的对象都是同一个对象。所以通过Application来进行一些数据传输,数据共享,数据缓存等操作。

解决办法:

看了大多数都是onSaveInstanceState和OnRestoreInstanceState来保存UI状态的,基本上就是在按下Home键或者其他情况的时候存储数据,然后再次打开APP的时候读取bundle的数据,因为一般项目都有多个Activity,这样做比较麻烦。

这里将将一个简单粗暴的方法:Activity加载布局之前判断当前程序是否被系统回收,如何是则重新启动APP或者重新初始化全局变量;

具体代码如下:

1.创建一个类保存APP是否被回收的两个静态变量;

public class AppStatusConstant {
    public static final int STATUS_FORCE_KILLED = -1; //应用放在后台被强杀了
    public static final int STATUS_NORMAL = 1;  //APP正常态
}

2.创建AppStatus的管理类,并初始APPStatus(APP状态)的值为被系统回收状态;

public class AppStatusManager implements Application.ActivityLifecycleCa
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值