Activity生命周期与onNewIntent

Activity生命周期与onNewIntent


standard模式下Activity的生命周期

Activity第一次启动时:onCreate -> onStart -> onResume
Activity再次启动时:onPause(原来的实例) -> onCreate(新的实例) -> onStart(新的实例)   -> onResume(新的实例) -> onStop(原来的实例)
所以,标准模式下,activity被多次启动,不会回调onNewIntent方法。

standard模式下Activity的生命周期


Activity第一次启动时:onCreate -> onStart -> onResume
Activity再次启动时:onPause -> onNewInent -> onResume

Activity第三次启动时:onPause -> onNewInent -> onResume
所以,非标准模式下,activity第一次被启动,会正常回调生命周期方法,不会回调onNewIntent方法。多次启动该activity后,均会调用 onNewInent方法。
注意:当调用到onNewIntent(intent)时,该参数的intent是最新的intent,可在onNewIntent中使用setIntent(intent),这样后续使用getIntent()时将获得最新的intent.否则,后续getIntent()得到的是旧的intent。
A画面singleTask模式下:
画面如下跳转:
A-B-A
A的生命周期如下,开发者模式中,保留活动:
1. A启动:onCreate: null == savedInstanceState -> onStart -> onResume
2. 跳转到B:onStop
3. 跳转到A:onNewIntent -> onRestart -> onStart -> onResume

A的生命周期如下,开发者模式中,不保留活动:
1. A启动:onCreate: null == savedInstanceState -> onStart -> onResume
2. 跳转到B:onStop -> onDestroy
3. 跳转到A:onCreate: null == savedInstanceState -> onStart -> onResume
也就是说,不会走onNewIntent

退出账号重新登录的实现方式


主画面设置成singleTask模式,那么在退出登录后,重新statActivity主画面,并且intent传入一个标志位:
1.主画面未被异常关闭时,此时会走onNewIntent()方法,并且主画面之上的画面会被推出栈,在该方法中根据intent传入的标志位,启动重新登录画面,关闭主画面;
2.主画面被异常关闭时,此时不会走onNewIntent()方法,并且主画面之上的画面会被推出栈,在onCreate方法中根据intent传入的标志位,启动重新登录画面,关闭主画面。
注意:
activity异常退出的时候,比如屏幕横竖切换、内存不足低优先级的activity被杀死,ondestroy仍然会被调用,除非直接退出整个进程System.exit(0)不会调用ondestroy。
那么在oncreate里把activity对象放到一个栈里,然后在ondestroy中把这个activity移除栈,是没有问题的,不会发生内存泄漏。

如果有不妥当的地方,请留言共同探讨共同进步

你可能感兴趣的:(技术分享)