问题:

app运行在后台,android系统会在内存不够用的时候,回收app,如果app中有全局的变量,那么再次打开app可能会出现崩溃的情况。

示例:

示例源码

public class MyApplication extends Application {String name;String getName() {return name;}void setName(String name) {this.name = name;}public static  MyApplication sMyApplication;public static MyApplication getApplication(){if (sMyApplication == null) {synchronized (MyApplication.class) {if (sMyApplication == null) {return sMyApplication = new MyApplication();}}}return sMyApplication;}
}
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyApplication app = (MyApplication) getApplication();app.setName("Developer Phil");Toast.makeText(this, "1:" + app.getName(),Toast.LENGTH_LONG).show();Log.d("1:",app.getName());startActivity(new Intent(this, Main2Activity.class));}
}    
public class Main2Activity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);Toast.makeText(this, "2:onCreate()",Toast.LENGTH_LONG).show();Log.d("2:onCreate()","onCreate()");}@Overrideprotected void onResume() {super.onResume();MyApplication app = (MyApplication) getApplication();Toast.makeText(this, "2:"+app.getName().toUpperCase(),Toast.LENGTH_LONG).show();Log.d("2:",app.getName());}
}

原因:

程序之所以会崩溃掉是因为恢复之后APP的Application对象是全新的,所以缓存在Application中的用户名成员变量为空值,在程序调用String的toUpperCase()方法时由于NullPointerException而崩溃掉。

导致这个问题的主要原因是:Application对象并不是始终在内存中的,它有可能会由于系统内存不足而被杀掉(可通过下面的命令模拟)。但Android在你恢复这个应用时并不是重新开始启动这个应用,它会创建一个新的Application对象并且启动上次用户离开时的activity以造成这个app从来没有被kill掉得假象。

解决方法:

大概思路:

第一种:
A app的引导页面
B app的首页,启动模式为singleTask

app中设置一个静态变量,静态变量中的变量默认值设置为被系统回收,app正常启动后,设置为正常启动。

这样当app被回收后,再次打开app,静态变量中的变量为被系统回收,app从A界面重新启动,A启动B,由于activity栈中肯定存在B,并且B在栈底(因为B为app首页),所以启动B后,所有的activity都被清除。

实现了在保证栈顺序正确的情况下,实现了重新开启app

第二种

你也可以考虑,系统销毁activity后,再次开启app后,重新创建 Activity,使用函数 onSaveInstanceState()进行数据的保存

代码如下:

1、添加以下常量:

public static final int STATUS_FORCE_KILLED = -1;//应用在后台被强杀了
public static final int STATUS_NORMAL = 2; //APP正常态
public static final String START_LAUNCH_ACTION = "start_launch_action"; private int appStatus = Constants.STATUS_FORCE_KILLED; //默认为被后台回收了
private static AppUtils appStatusManager;public static AppUtils getInstance() {if (appStatusManager == null) {appStatusManager = new AppUtils();}return appStatusManager;}public int getAppStatus() {return appStatus;
}public void setAppStatus(int appStatus) {this.appStatus = appStatus;
}

2、BaseActivity ,每一个activity都继承BaseActivity

public class BaseActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);switch (AppUtils.getInstance().getAppStatus()) {case Constants.STATUS_FORCE_KILLED:restartApp();break;case Constants.STATUS_NORMAL:break;default:break;}}protected void restartApp() {Intent intent = new Intent(this, LaunchActivity.class);intent.putExtra(Constants.START_LAUNCH_ACTION,Constants.STATUS_FORCE_KILLED);startActivity(intent);}
}    

3、app引导页面

 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//这里设置为app正常态AppUtils.getInstance().setAppStatus(Constants.STATUS_NORMAL);}

4、app的首页

注意app的首页的启动模式一定要设置为singleTask

模拟系统回收

app运行在后台,android系统会在内存不够用的时候,回收运行在后台的app,它有以下三种作用。

  • 不保留app内存数据(全局的单例等),
  • 保留activity堆栈数据,
  • 再次开启app,会调用onCreate()重新创建栈顶的activity,

模拟:

  • terminal application

  • kill掉进程

1、 按Home按键退出你的程序;
2、

 # 找到该APP的进程IDadb shell ps# 找到你APP的报名adb shell ps | grep your.app.package# 按照上述命令操作后,看起来是这样子的: # USER      PID   PPID  VSIZE  RSS     WCHAN    PC         NAME# u0_a198   21997 160   827940 22064 ffffffff 00000000 S your.app.package# 通过PID将你的APP杀掉adb shell kill  21997# APP现在被杀掉啦

不保留活动

android 系统在开发者选项中,有一个不保留活动的选项,它有以下三种作用。

  • 保留app内存数据(全局的单例等),
  • 保留activity堆栈数据,
  • 再次开启app,会调用onCreate()重新创建栈顶的activity,

参考:
不要在Android的Application对象中缓存数据!

android开发中模拟系统内存不足 应用释放的情

如何让你的app在后台被干掉后优雅的重新启动

[问答]离开应用界面一段较长的时间后再回到应用,易出现崩溃的原因

APP在后台被系统回收后,如何重新启动相关推荐

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

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

  2. APP在后台被系统杀死的六种主要原因

    主要介绍在APP在后台被系统杀死的六种主要原因,源自WWDC视频, 并且告诉你怎么使用MetricKit框架去发现和减少程序被强制杀死的概率:怎么防止崩溃:怎么使用后台机制,怎么找到潜在的问题并采取行 ...

  3. App在后台被杀死后重启-重进首页方法

    感谢这位哥的思路. 这个问题很常见,基本所有app都会遇到这个问题.但是很多开发者都没有处理. 问题的起因:我的app在进入后台后一段时间,可能被系统干掉了,然后通过多任务键,或者图标再点进去操作,出 ...

  4. android app系统的测试_计算机毕设项目003之基于Android系统的App点餐外送系统

    计算机毕设项目之基于Android系统的App点餐外送系统 一. 项目名称 基于Android系统的App点餐外送系统 二. 项目简介 本项目是基于Android系统的手机点餐系统,整个项目分为App ...

  5. android 后台运行清理,【Android】App在后台被清理后的终极应对手段——重启应用...

    检测App是否在后台期间被销毁 添加一个null值的Object标记对象到Application,并在App运行期间赋值一个非null任意对象,如果App在后台期间被OS销毁,则该对象会被清空(适用于 ...

  6. android app 的后台代码,包括后台的Android美食APP项目开源代码

    项目简介 小食光定位为一款集美食,社交,LBS服务于一体的美食推荐APP.为你发现周边美食的同时提供一个吃货分享的平台. APP截图 功能模块 美食推荐 :提供基础的美食信息查询: 商家推荐 : 基于 ...

  7. iOS保持App真后台运行

    https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就 ...

  8. 一个开源的酒店预定App及其后台管理系统

    #住哪儿App App github地址 AppLogo 实现了类似艺龙App的预定酒店功能,包括酒店搜索.特色酒店推荐.特惠酒店推荐等等功能,可以预定酒店.查看订单,唯独不能支付(支付功能必须由公司 ...

  9. Android设计开发 答题app 安卓+后台Java+数据库mysql

    Android设计开发 答题app 安卓+后台Java+数据库mysql 基于安卓设计开发答题系统界面简洁大方 有用户注册,登录模块 主页,答题,选择答案,提交答案等模块 程序已经调试完成,包括前端安 ...

最新文章

  1. 使用VS Code开发.Net Core 2.0 MVC Web应用程序教程之三(配置文件读取)
  2. 2021年洛谷一月月赛(Div1、Div2,6题)全部题解
  3. 每天2亿美元投入AI领域,1/10砸向自动驾驶,中国AI论文首超全欧洲 | 斯坦福全球AI年度报告...
  4. c#实现数据集合转换为csv文本
  5. 初识ES-什么是elasticsearch
  6. AT3957-[AGC023F]01 on Tree【贪心,堆】
  7. 逃离深圳的华为,原来可以这么美:研发小姐姐第一天上班游记
  8. QQ总显示服务器请求中,网站添加QQ登陆 报错 可能是服务器无法请求https协议 解决方法...
  9. linux内核驱动摄像头图片,详解linux 摄像头驱动编写
  10. 印刷质量缺陷的视觉检测原理概述
  11. 搭建Ubuntu下c/c++编译环境
  12. 一个WEB应用的开发流程 供学习用!
  13. 《CRAFT:Character Region Awareness for Text Detection》论文笔记
  14. 浅谈视频加密一机一码的具体使用及优势
  15. 链表 java 实现
  16. 知名的网址导航网站及好用的网址导航分享
  17. python 字符串转ASCII码
  18. 国家开放大学2021春2623中医药学概论题目
  19. 让maven使用国内镜像和archetypeCatalog
  20. 大数据告诉你:2018年该学习什么技术

热门文章

  1. 北京现代APP每日问答合集(持续更新)
  2. 冒泡排序--咕噜咕噜
  3. [RK3399][Android7.1] 调试笔记 --- Audio codec时钟源从BCLK1获取
  4. 超级计算机也无法算尽圆周率,如果圆周率算尽了,会出现什么后果?
  5. xr企业级应用在哪里_如何在XR中保持私密
  6. 戴尔G3 Ubuntu18.04双系统安装
  7. BERT |(3)BERT模型的使用--pytorch的代码解释
  8. 一款让人耳目一新的事件驱动型RTOS
  9. 恶意软件通信协议的应用现状分析
  10. 三位一体自荐信计算机专业,三位一体自荐信写法和范文