onStart 和onResume,onPause 和onStop从描述来看差不多,对我们来说有没有实质的不同呢?
实际使用过程来说,确实差不多,甚至可以只保留其中一对,而这两哥配对的回调分别表示不同的意义,onStart和onStop是从Activity是否可见这个角度来回调的,而已onPause和onStop是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显的区别。
假设当前Activity为A,如果这时用户打开一个新ActivityB,那么B的onResume和A的onPause哪个先执行呢?
A的onPause先执行,B的onResume再执行。官方文档也解释不能在onPause中做重量级的操作,因为onPause执行完成后新的Activity才能Resume。通过分析,onPause和onStop都不能执行耗时的操作,尤其是onPause,这也意味着,我们应当尽量在onStop中做操作,从而使得新的Activity尽快显示并切换到前台。
Activity的LaunchMode启动模式:
standard:标准模式,也是系统默认模式。每次启动都会重新创建一个新的实例,不管这个实例是否存在。这种模式默认会进入启动它的Activity所属的任务栈,
singleTop:栈顶复用模式。这种模式下,如果新的Activity已经位于任务栈的栈顶了,那么该Activity就不会重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数,我们可以取出当前的请求信息。注意:这个Activity的onCreate、onStart不会被系统调用,因为它并没有发生改变。如果新的Activity已经存在,但是不是位于栈顶,那么它仍然会重建。
singleTask:栈内复用模式,也是一种单实例模式。在这种模式下,只要Activity在一个栈中存在了,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调onNewIntent。同时singleTask默认具有clearTop的效果,这就会导致栈内所有在该Activity上面的Activity全部出栈。
singleInstance:单实例模式。这是一种加强的singleTask模式,除了具有singleTask模式的特性外,还加强了一点,那就是具有此种模式的Activity只能单独位于一个任务栈中。比如Activity A是singleTask模式,但A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求都不会再创建新的Activity,除非这个独特的任务栈被系统销毁。
Activity的Flags有很多,常用的也就几个:
FLAG_ACTIVITY_NEW_TASK: 此标志位的作用类似于Activity指定的“singleTask”启动模式。
FLAG_ACTIVITY_SINGLE_TOP: 此标志位的作用类似于Activity指定的“singleTop”启动模式。
FLAG_ACTIVITY_CLEAR_TOP: 具有此标志位的Activity,当它启动的时候,在同一个任务栈中所有位于它上面的Activity都要出站,这个模式一般需要和FALG_ACTIVITY_NEW_TASK配合使用。在这种情况下被启动的Activity已经存在,那么系统就会调用它的onNewIntent。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS: 具有此标志位的Activity不会出现在历史Activity的列表中,单某些情况下我们不希望用户通过历史列表回到我们的Activity的时候这个标记比较有用。它等同于在XML中指定Activity的属性 android:excludeFromRecents="true" 。
网友评论