按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在棧中只有一個並且在最底層


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM