今天遇到了android启动模式设置的问题,对于具体每个参数的含义一直是一知半解,于是下决心搞清楚。
在网上搜了几篇文章看了感觉有些凌乱,索性去android developer上搜,看了文档忽然感觉原来读的那几篇文章都是只是在翻译文档而已(而且翻译的还不给力)。让我更加确信一点就是:有了问题先去官网搜文档,一般问题官网描述的就很清晰;如果仍没能解开心里的疑惑再看别的网友分析或者寻求其他解决方案。
废话不多说了直接看源文档内容:
android:launchMode
FLAG_ACTIVITY_*
constants) in
Intent
objects to determine what should happen when the activity is called upon to handle an intent. They are:
"standard
"
"singleTop
"
"singleTask
"
"singleInstance
"
The default mode is "standard
".
As shown in the table below, the modes fall into two main groups, with "standard
" and "singleTop
" activities on one side, and "singleTask
" and "singleInstance
" activities on the other. An activity with the "standard
" or "singleTop
" launch mode can be instantiated multiple times. The instances can belong to any task and can be located anywhere in the activity stack. Typically, they're launched into the task that called
(unless the Intent object contains astartActivity()
instruction, in which case a different task is chosen — see the taskAffinityattribute).FLAG_ACTIVITY_NEW_TASK
In contrast, "singleTask
" and "singleInstance
" activities can only begin a task. They are always at the root of the activity stack. Moreover, the device can hold only one instance of the activity at a time — only one such task.
The "standard
" and "singleTop
" modes differ from each other in just one respect: Every time there's a new intent for a "standard
" activity, a new instance of the class is created to respond to that intent. Each instance handles a single intent. Similarly, a new instance of a "singleTop
" activity may also be created to handle a new intent. However, if the target task already has an existing instance of the activity at the top of its stack, that instance will receive the new intent (in an
call); a new instance is not created. In other circumstances — for example, if an existing instance of the "onNewIntent()
singleTop
" activity is in the target task, but not at the top of the stack, or if it's at the top of a stack, but not in the target task — a new instance would be created and pushed on the stack.
The "singleTask
" and "singleInstance
" modes also differ from each other in only one respect: A "singleTask
" activity allows other activities to be part of its task. It's always at the root of its task, but other activities (necessarily "standard
" and "singleTop
" activities) can be launched into that task. A "singleInstance
" activity, on the other hand, permits no other activities to be part of its task. It's the only activity in the task. If it starts another activity, that activity is assigned to a different task — as if FLAG_ACTIVITY_NEW_TASK
was in the intent.
Use Cases | Launch Mode | Multiple Instances? | Comments |
---|---|---|---|
Normal launches for most activities | "standard " | Yes | Default. The system always creates a new instance of the activity in the target task and routes the intent to it. |
"singleTop " | Conditionally | If an instance of the activity already exists at the top of the target task, the system routes the intent to that instance through a call to itsonNewIntent() method, rather than creating a new instance of the activity. | |
Specialized launches (not recommended for general use) | "singleTask " | No | The system creates the activity at the root of a new task and routes the intent to it. However, if an instance of the activity already exists, the system routes the intent to existing instance through a call to itsonNewIntent() method, rather than creating a new one. |
"singleInstance " | No | Same as "singleTask" , except that the system doesn't launch any other activities into the task holding the instance. The activity is always the single and only member of its task. |
As shown in the table above, standard
is the default mode and is appropriate for most types of activities. SingleTop
is also a common and useful launch mode for many types of activities. The other modes — singleTask
and singleInstance
— are not appropriate for most applications, since they result in an interaction model that is likely to be unfamiliar to users and is very different from most other applications.
Regardless of the launch mode that you choose, make sure to test the usability of the activity during launch and when navigating back to it from other activities and tasks using the Back button.
For more information on launch modes and their interaction with Intent flags, see the Tasks and Back Stack document.