android应用被强杀或应用被回收导致的空指针问题等其他问题 - 简书
在开发中我们经常会遇见app退到后台再打开会出现空指针、页面显示不全等一系列奇怪的问题。
问题分析:
当我们的进程被强杀或者被回收的时候,Android系统虽然让你的进程没有了,但是此进程中Activity中栈的信息还是存在的,也就是说此时当你点开此应用的时候程序中的Activity栈信息仍然存在,只不过Activity中的数据都没有了,需要重新创建新的Activity数据。
处理方式:
分别涉及到:一个单例ConstantInstance 基类BaseAcyivity 首页MainActivity 启动页IndexActivity
在启动页IndexActivity 存一个单例值
1 | public class IndexActivity extends BaseAcyivity{ |
基类BaseAcyivity onCreate方法判断单例的值
1 | public class BaseAcyivity extends AutoLayoutActivity { |
MainActivity的onNewIntent
1 |
|
ConstantInstance
1 | public static final int STATUS_FORCE_KILLED = -1; //应用放在后台被强杀了 |
防止应用被强杀而导致的空指针
当系统的内存不足的时候,系统会把后台程序强杀掉,所有的变量都被清空了,唯有activity的栈信息被保留。当用户再次启动这程序的时候,它会从之前的界面开始启动(有点坑,干嘛不重头来呢)。一旦这个界面有静态变量(静态变量随着类的加载而加载)并且对这个静态变量进行取值操作,就会导致了空指针异常。下面讲解如何设计框架避免这个问题:
1 | public class CustomApplication extends Application{ |
1 | public class BaseActivity extends AppCompatActivity { |
1 | //app的入口界面 |
1 | public class HomeActivity extends BaseActivity implements View.OnClickListener { |
不管app是在HomeActivity或其他的Activity被强杀,因为这些Activity都继承BaseActivity,所以会先执行BaseActivity的onCreate(),这时候mAppStatus=-1.那么为什么要跳转到HomeActivity呢?HomeActivity的启动模式被设置为SingleTask,处理应用被强杀也是借助singletask,强杀了但activity栈未被清空,所以为了避免空指针,需要重新退出app再重新走应用流程WelcomeActivity。