按home退出程序到后台后再打开崩溃的问题

开发中经常会遇到这样的情况:

      按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 }
MyApplication.java

     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 }
BaseActivity.java

    4、MainActivity中复写protectApp()方法,直接跳转到启动页,重启activty,重新初始化application中的静态变量

 @Override
 protected void protectApp() {
      startActivity(new Intent(this,SplashActivity.class));
      finish();
 }

    5、MainActivity的启动模式设为singleTask,保证MainActivty在栈中只有一个并且在最底层

posted on 2015-10-08 17:16  3A87  阅读(2295)  评论(0编辑  收藏  举报

导航