开发中经常会遇到这样的情况:
按home键退出程序,让其运行在后台,然后去操作其他程序或放置在一边,过一段时间再次打开时可能会出现崩溃。
分析原因(有可能是别的原因):
在Application中声明了若干静态变量,这些静态变量往往只在程序一开始的时候初始化,然后应用在多个activity,当程序退出到后台运行的时候,
手机可能会因为内存不足而杀掉该进程,这时application中的静态变量也被清空。而当再次点开程序时,当前activity中可能正好用到其中某个静态变量,从而
抛出空指针异常。
解决办法:
打开activity的时候判断当前程序是否被系统杀掉,如果是则需重新启动。
1、在applciation中声明变量flag,用于标志程序是否被杀掉
1 package com.zy.baseproject.application; 2 3 import com.zy.baseproject.bean.User; 4 5 import android.R.integer; 6 import android.app.Application; 7 8 public class MyApplication extends Application { 9 private static User user; 10 public static int flag=-1; 11 12 public static User getUser() { 13 return user; 14 } 15 16 public static void setUser(User user) { 17 MyApplication.user = user; 18 } 19 20 }
2、在启动页(SplashActivity)中改变flag的值
MyApplication.flag=0;
3、新建BaseActivity(除SplashActivity外所有Activity都需要继承这个Activity),在这里判断是否需要重启程序
1 package com.zy.baseproject.activity; 2 3 import com.zy.baseproject.application.MyApplication; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.os.Bundle; 8 9 public abstract class BaseActivity extends Activity { 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 // TODO Auto-generated method stub 13 super.onCreate(savedInstanceState); 14 if(MyApplication.flag==-1){//flag为-1说明程序被杀掉 15 protectApp(); 16 }else { 17 setContentView(); 18 initializeView(); 19 initializeData(); 20 } 21 } 22 23 protected void protectApp() { 24 Intent intent=new Intent(this,MainActivity.class); 25 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//清空栈里MainActivity之上的所有activty 26 startActivity(intent); 27 finish(); 28 } 29 30 protected abstract void initializeData(); 31 32 protected abstract void initializeView(); 33 34 protected abstract void setContentView(); 35 36 }
4、MainActivity中复写protectApp()方法,直接跳转到启动页,重启activty,重新初始化application中的静态变量
@Override protected void protectApp() { startActivity(new Intent(this,SplashActivity.class)); finish(); }
5、MainActivity的启动模式设为singleTask,保证MainActivty在栈中只有一个并且在最底层