如何让你的 app 在后台被干掉后优雅的启动,flutter 调用原生 sdk
具体实现
AppStatusConstant
public static final intSTATUS_FORCE_KILLED = -1;//应用放在后台被强杀了 public static final intSTATUS_NORMAL = 2; //APP 正常态//intent 到 MainActivity 区分跳转目的 public static finalStringKEY_HOME_ACTION = "key_home_action";//返回到主页面 public static final intACTION_BACK_TO_HOME = 0;//默认值 public static final intACTION_RESTART_APP = 1;//被强杀
AppStatusManager
public intappStatus= AppStatusConstant.STATUS_FORCE_KILLED; //APP 状态初始值为没启动不在前台状态 public staticAppStatusManagerappStatusManager;privateAppStatusManager() {}public staticAppStatusManagergetInstance() {if(appStatusManager==null{appStatusManager=newAppStatusManager();}returnappStatusManager;}public intgetAppStatus() {returnappStatus;}public voidsetAppStatus(intappStatus) {this.appStatus= appStatus;}
BaseActivity(大致内容)
s
witch(AppStatusManager.getInstance().getAppStatus()) {caseAppStatusConstant.STATUS_FORCE_KILLED:restartApp();break;caseAppStatusConstant.STATUS_NORMAL:setUpViewAndData();break;}protected abstract voidsetUpViewAndData();protected voidrestartApp() {Intent intent =newIntent(this,MainActivity.class);intent.putExtra(AppStatusConstant.KEY_HOME_ACTION,AppStatusConstant.ACTION_RESTART_APP);startActivity(intent);}
每一个继承于父 activity 的都不要在 oncreat 中实现界面初始化和数据的初始化,因为如果被杀死之后,回来会走一次正常的生命流程的。
StartPageActivity 配置(在 oncreat()方法配置,并且在 super()前):
AppStatusManager.getInstance().setAppStatus(AppStatusConstant.STATUS_NORMAL);//进入应用初始化设置成未登录状态
MainActivity(配置了 singleTask 的主界面)
@Overrideprotected voidrestartApp() {Toast.makeText(getApplicationContext(),"应用被回收重启",Toast.LENGTH_LONG).show();startActivity(newIntent(this,StartPageActivity.class));finish();}@Overrideprotected voidonNewIntent(Intent intent) {super.onNewIntent(intent);intaction = intent.getIntExtra(AppStatusConstant.KEY_HOME_ACTION,AppStatusConstant.ACTION_BACK_TO_HOME);switch(action) {caseAppStatusConstant.ACTION_RESTART_APP:restartApp();break;}}
当应用打开的时候,启动 StartPageActivity,然后设置 app 的 status 为 normal 状态,记住,一定要设置,因为默认的是被杀死的状态的。
当应用被杀死之后,所有数据都会被回收,所以之前设置的 app status 也会置于默认状态,即杀死状态,所以再次打开 app 的时候,status 为杀死状态,就会走重启的流程,这里为什么要先跳转到 MainActivity 呢?就是因为 MainActivity 配置为了 Sing 了 Task,当跳转到这个界面时,MainActivity 就会置于 Activity Task 的最上层,其他的 Activity 将会被默认销毁掉,利用这种技巧去销毁其他的 Activity,最后才是重新启动 StartPageActivity。整个流程就是这样了。
大致的实现就如上所述了,我所倡导的宗旨就是花最少的时间,写最好的代码,实现最好的体验!之前也参考过很多网上大神们的实现方式,但是我觉得以上实现的应该是比较完整的一种了。
最后
如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!
转发+点赞+关注,第一时间获取最新知识点
Android 架构师之路很漫长,一起共勉吧!
以下墙裂推荐阅读!!!
最后祝大家生活愉快~
评论