大家好,欢迎来到IT知识分享网。
Android:APP长时间后台,再打开崩溃的问题
导致原因
解决办法
网上大多解决这种问题的做法是使用onSaveInstanceState和onRestoreInstanceState来保存UI状态的,基本上就是在按home键或者其他情况的时候存储数据,然后再次点开APP的时候读取bundle的数据。不过一般一个项目都有很多页面,存储数据这种方法就会很麻烦。
这里介绍个简单粗暴的方法:activity加载布局之前判断当前程序是否被系统回收,如果是则重新启动app。
首先新建AppStatus 类
public class AppStatus {
public static final int STATUS_RECYVLE =-1; //被回收 public static final int STATUS_NORMAL=1; //正常 }
新建AppStatusManager类控制状态
public class AppStatusManager {
public int appStatus = AppStatus.STATUS_RECYCLE; //APP状态 初始值为不在前台状态 private static AppStatusManager appStatusManager; private AppStatusManager(){
} //单例模式 public static AppStatusManager getInstance() {
if (appStatusManager == null) {
appStatusManager = new AppStatusManager(); } return appStatusManager; } public int getAppStatus() {
return appStatus; } public void setAppStatus(int appStatus) {
this.appStatus = appStatus; } }
闪屏页修改状态
public class SplashActivity extends AppCompatActivity {
private ImageView sp; @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.startup); sp=(ImageView) findViewById(R.id.imageView); //AlphaAnimation anima = new AlphaAnimation(0.3f, 1.0f); //anima.setDuration(2500);// 设置动画显示时间 //sp.startAnimation(anima); //anima.setAnimationListener( new MyAnimationListener()); sp.postDelayed(new Runnable() {
@Override public void run() {
Intent intent = new Intent(SplashActivity.this, MainActivity.class); //app状态改为正常 AppStatusManager.getInstance().setAppStatus(AppStatus.STATUS_NORMAL); startActivity(intent); finish(); } }, 2500); } }
清单文件中MainActivity的启动模式要设为singleTask
<activity android:name=".MainActivity" android:launchMode="singleTask" />
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); if (AppStatusManager.getInstance().getAppStatus() == AppStatus.STATUS_RECYCLE){
//跳到闪屏页 Intent intent = new Intent(this, SplashActivity.class); startActivity(intent); finish(); return; } setContentView(R.layout.activity_main); Button bt = (Button) findViewById(R.id.bt); bt.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, TestActivity.class); startActivity(intent); } }); } }
新建一个BaseActivity继承AppCompatActivity,其他Activity继承BaseActivity
public class BaseActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); if (AppStatusManager.getInstance().getAppStatus() == AppStatus.STATUS_RECYCLE){
//跳到MainActivity,让MainActivity也finish掉 Intent intent = new Intent(this, MainActivity.class); startActivity(intent); finish(); return; } } }
public class TestActivity extends BaseActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125883.html