被后台杀死后,Android应用如何重新走闪屏逻辑

被后台杀死后,Android应用如何重新走闪屏逻辑

当应用被后台杀死后,Android是如何走闪屏逻辑的?

恢复的过程是先恢复的第一个界面是用户最后看到的那个界面。

如下图是杀死之前的堆栈:

1

如下图是被后台杀死后,Activity的堆栈,既然被销毁了自然堆栈为空,但是AMS被保留下来

2

当用户再次启动APP,看到的是最后看到的那个Activity,也就是C Activity。

3

在用户点击返回后,看到的C Activity之前的B Activity,以此类推。

怎么判断当前Activity是否为恢复流程状态?

1
2
3
4
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

只需要判断savedInstanceState是否非空即可判断,如果为非空,则为后台杀死恢复流程。

如何在恢复流程APP,走闪屏的逻辑?

  • 进程存活,Activity存活
  • 进程存活,但是没有Activity存活
  • 进程不存在(无论是否被杀)

其实后面两种完全可以看做一种,这个时候,都是要先start MainActivity,然后让MainActivity在其OnCreate中通过startActivityForResult启动SplashActivity,SplashActivity返回后,在start TargetActivity。下面的讨论都是针对后面两种,需要做的有两件事

  • 一是:检测出后面两种场景,并且在唤起主界面的时候需要添加Intent.FLAG_ACTIVITY_CLEAR_TASK清理之前的现场
  • 二是:在MainActivity的路由系统中,针对这两种场景要,先跳转闪屏,闪屏回来后,再跳转推送页
1
2
3
4
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.setDate(跳转的Uri scheme)
startActivity(intent);

在MainActivity的路由中,需要区分是否推送跳转进来的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri= getIntent().getData();
<!--只有在intent被设置了跳转数据的时候才去跳转,一般是推送就来,如果冷启动,是没有数据的-->
if(uri!=null){
SplashActivity.startActivityForResult(this,JUMP_TO_TARGET)
}
}
<!--Intent.FLAG_ACTIVITY_CLEAR_TASK保证了onNewIntent被调用的时候,进程一定是正常活着的-->
@Override
protected void onNewIntent(Intent intent) {
Uri uri= intent.getData();
intent.setData(null);
router(uri);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==JUMP_TO_TARGET && requestCode == RESULT_OK){
router(getIntent().getData());
getIntent().setData(null);
}
}

private void router(Uri uri) {

}