Android 启动模式(LaunchMode)的作用
Android 启动模式的作用是为了控制系统任务栈,从而实现了系统Activity的返回功能,系统定义的启动模式分为4类,standard(标准的),singleTop(栈顶复用),singleTask(栈内复用),singleInstance(加强的单实例模式)。
1.四种模式简介
a: standard 为系统默认的启动模式,系统每次启动一个Activity都会重新创建一个实例(不管这个实例存在与否,每次启动都会新建),并将其加载到任务中。
b: singleTop 栈顶复用,当要启动的Activity位于栈顶的时候,此时不用重新创建实例,而是重新复用这个栈顶实例,并调用它的onNewIntent()方法,当要启动的Activity不是栈顶元素的时候,则按照系统默认的即 standard处理。
c:singleTask 栈内复用,这是一种单实例模式,当任务栈中存在这个Activity实例的时候,系统会复用这个Activity实例,并且调用onNewIntent()方法,并且有clearTop的功能。如果不是栈顶元素的话,那位于当前Activity之上的都会被弹出栈。
d:singleInstance 单实例模式,这是一种加强的singleTask,除了singleTask的特点以外,还有一个特点那就是这个Activity必须单独位于一个任务栈中,所以当后续在启动这个Activity的时候会复用之前的任务栈而不是新建。
2.Activity常用的flag
FLAG_ACTIVITY_NEW_TASK:这个标记的效果和singleTask启动模式相同。
FLAG_ACTIVITY_SINGLE_TOP:这个标记的效果和singleTop启动模式相同.
FLAG_ACTIVITY_CLEAR_TOP:具有次标记的Activity,当启动他的时候在同一个任务栈的所有位于他之上的Activity都要出栈,这个标记一般会和singleTask一起使用,在这种情况下如果被启动的Activity存在,那么系统会调用它的onNewIntent()方法,如果被启动的是Activity是标准模式,则连同他和他之上的activity都要出栈。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有此标记位的Activity不会出现在历史Activity的列表中,使用场景:当某些情况下我们不希望用户通过历史列表回到Activity时,此标记位便体现了它的效果。
面试点:
面试官怎么问 Activity 的启动模式(launchMode)?
怎么问?
1、设置为 singleTask 的启动模式,当 Activity 的实例已经存在时,再启动它,它的哪个回调函数会被执行?我们可以在哪个回调中处理新的 Intent 协带的参数?(通过 startActivity(Intent) 方式启动)
2、设置为 singleTop 的启动模式,当 Activity 的实例已经存在于 Task 的栈顶,我们可以在哪个回调中处理新的 Intent 协带的参数?(在当前 Activity 中从通知栏点击再跳转到此 Activity 就是这种在栈顶的情况)
startActivityForResult 启动一个 Activity,还没有开始界面跳转,直接就执行了 onActivityResult()。
我们在 Activity.java 的 startActivityForResult() 方法中可以看到这样一串说明。
startActivityForResult方法的说明很多人出现这个问题,确实是因为startActivityForResult()启动的 Activity 设置了 singleTask 的启动模式。
好在 Android 5.0 以后,修正了这个问题。不过当你在 Intent 中设置 FLAG_ACTIVITY_NEW_TASK 后还是会出现这样的问题。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
注意:MainActivity 的 onResume() 也会被触发。因为 onActivityResult() 被执行时,它会重新获得焦点。很多人也会遇到 onResume() 被无故调用,也许就是这种情况。
网友评论