假设有两个Activity,A和B,A拉起B,正常情况下生命周期回调的顺序应该是:
A.onPause()
B.onCreate()
B.onStart()
B.onResume()
A.onStop()
然而有一种情况会导致A在拉起B后不会执行A.onStop(), 那就是 A拉起B后,再迅速回到A。这种场景一般用户手动操作很难出现,但是如果再B的onCreate方法中调用了finish() 就会出现这种情况。代码如下:
MainActivity.java:
public class MainActivity extends BaseActivity {
private static final String TAG = "MainActivity";
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startSecondActivity();
}
});
Log.i(TAG, "onCreate()");
}
private void startSecondActivity() {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
}
}
SecondActivity.java:
public class SecondActivity extends BaseActivity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
finish();
}
}
可以看到,在SecondActivity 的onCreate方法中我们直接调用finish,回到MainActivity,这时候MainActivity的onStop方法不会被调用。
可能有人觉得谁会这么傻在onCreate中直接调finish,简直毫无意义!可是我真的在业务中遇到过这种代码。
情况是这样的:我们的app在进入一个页面之后会用一个callback给另外的模块发送一个状态,那个模块会根据这个状态去决定是否推荐一些商品,并拉起商品推荐页面。按照正常的逻辑,应该是那边模块先判断要不要推荐,然后拉起推荐页面的Activity区展示推荐的商品。可是他们的实现是无论如何先拉起页面,然后在onCreate方法中去判断该不该推荐,如果推荐就接着展示,如果不该就直接finish退出。
这种实现显然是有问题的,如果在onCreate中判断该不该推荐的过程中有一些耗时操作,而最后判断的结果又是不推荐,那么很容易造成用户进入我们的页面后看到一闪而过的白屏或黑屏现象,因为推荐的Activity并没有展示到前台,而它又确实消耗了不少时间。(事实上我们确实遇到了这种白屏问题)