按home退出程序到后台后再打开崩溃的问题
開發(fā)中經(jīng)常會(huì)遇到這樣的情況:
? ? ? 按home鍵退出程序,讓其運(yùn)行在后臺(tái),然后去操作其他程序或放置在一邊,過一段時(shí)間再次打開時(shí)可能會(huì)出現(xiàn)崩潰。
分析原因(有可能是別的原因):
? ? ? 在Application中聲明了若干靜態(tài)變量,這些靜態(tài)變量往往只在程序一開始的時(shí)候初始化,然后應(yīng)用在多個(gè)activity,當(dāng)程序退出到后臺(tái)運(yùn)行的時(shí)候,
手機(jī)可能會(huì)因?yàn)閮?nèi)存不足而殺掉該進(jìn)程,這時(shí)application中的靜態(tài)變量也被清空。而當(dāng)再次點(diǎn)開程序時(shí),當(dāng)前activity中可能正好用到其中某個(gè)靜態(tài)變量,從而
拋出空指針異常。
解決辦法:
? ? ?打開activity的時(shí)候判斷當(dāng)前程序是否被系統(tǒng)殺掉,如果是則需重新啟動(dòng)。?
? ? ?1、在applciation中聲明變量flag,用于標(biāo)志程序是否被殺掉
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、在啟動(dòng)頁(SplashActivity)中改變flag的值
MyApplication.flag=0;? ? 3、新建BaseActivity(除SplashActivity外所有Activity都需要繼承這個(gè)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中復(fù)寫protectApp()方法,直接跳轉(zhuǎn)到啟動(dòng)頁,重啟activty,重新初始化application中的靜態(tài)變量
@Overrideprotected void protectApp() {startActivity(new Intent(this,SplashActivity.class));finish();}? ? 5、MainActivity的啟動(dòng)模式設(shè)為singleTask,保證MainActivty在棧中只有一個(gè)并且在最底層
轉(zhuǎn)載于:https://www.cnblogs.com/3A87/p/4861588.html
總結(jié)
以上是生活随笔為你收集整理的按home退出程序到后台后再打开崩溃的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个类实现多个接口的demo
- 下一篇: mysql保存中文乱码的原因和解决办法