官网解释链接
(tips:在阅读此文章前,应先对Activity生命周期掌握)
在每一个程序的main目录下有一个AndroidManifest.xml文件,这个文件是用来配置Activity的,在配置Activity时可指定android:launchMode 属性,该属性用于配置该Activity的启动模式(或称加载模式)。
eg:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testapp1">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TestApp1">
<activity android:name=".activity.MainActivity" android:launchMode="singleTop" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.NextActivity" />
<activity android:name=".activity.PersonActivity" android:launchMode="singleTop" />
</application>
</manifest>
android:launchMode 属性支持如下4个属性值:
Activity的启动模式负责管理实例化、启动Activity的方式,并可以控制Activity与Task之间的加载关系。
Task可以理解为Activity栈,Task以栈的形式来管理Activity,并且先启动的Activity被放入栈底,后启动的Activity被置于栈顶。
启动Activity时,Android都会为目标Activity创建一个新的实例,并添加在当前的Task栈中。特点:一直启动新的Activity实例并且不会启动新的Task。
MainActivity部分代码:
findViewById(R.id.imageButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), PersonActivity.class);
view.getContext().startActivity(intent);
}
});
PersonActivity部分代码:
findViewById(R.id.imageView2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(view.getContext(), MainActivity.class);
view.getContext().startActivity(intent);
}
});
上面两段代码意思是在MainActivity中点击id为imageButton的按钮时,启动PersonActivity;在PersonActivity中点击id为imageView2的控件时,启动MainActivity。
在AndroidManifest.xml中设置MainActivity和PersonActivity的启动模式为standard:
<activity android:name=".activity.MainActivity" android:launchMode="standard" >
<activity android:name=".activity.PersonActivity" android:launchMode="standard" />
运行程序,进入MainActivity,点击按钮启动PersonActivity,进入PersonActivity,点击图片控件启动MainActivity,进入MainActivity,再次点击按钮启动PersonActivity观察其生命周期的变化:
MainActivity实例1:onCreate()->
MainActivity实例1:onStart()->
MainActivity实例1:onResume()->
此时点击按钮->
MainActivity实例1:onPause()->
PersonActivity()实例1:onCreate()->
PersonActivity实例1:onStart()->
PersonActivity实例1:onResume()->
MainActivity实例1:onStop()->
此时点击图片控件->
PersonActivity实例1:onPause()->
MainActivity实例2:onCreate()->
MainActivity实例2:onStart()->
MainActivity实例2:onResume()->
PersonActivity实例1:onStop()->
此时点击按钮->
MainActivity实例2:onPause()->
PersonActivity()实例2:onCreate()->
PersonActivity实例2:onStart()->
PersonActivity实例2:onResume()->
MainActivity实例2:onStop()
上述生命周期加粗处以及图片标记颜色处发现:在同一个Activity对的实例未销毁,却进行的是onCreate()而不是onRestart()。因此,在标准模式下,Activity创建了新的对象加入Task栈顶,原来的实例在Task栈内。(不同Activity实例的hashCode值有差异,但它们所在的TaskID总是相同的,表明标准模式不会使用新的Task)
singleTop模式与standard模式类似,不同点在于singleTop模式时,若需启动的目标Activity已经位于Task栈顶时,系统不会重新创建目标Activity的实例,而是复用已有位于栈顶Activity实例。
其对于Activity生命周期的影响与standard模式不同的时,当动的目标Activity已经位于Task栈顶时,不会onCreate(),而是onRestart()。其他情况与standard模式保持一致,在此不做详细叙述。
采用singleTask这种加载模式的Activity能保证在同一个Task内只有某个Activity的一个实例,当系统采用singleTask 模式启动目标Activity时,可分为如下三种情况:
代码参考standard模式中贴的代码,其中将MainActivity与PersonActivity的启动模式设置为android:launchMode=“singleTask”
观察在singleTask模式下对Activity生命周期的影响:
MainActivity:onCreate()->
MainActivity:onStart()->
MainActivity:onResume()->
此时点击按钮->
MainActivity:onPause()->
PersonActivity():onCreate()->
PersonActivity:onStart()->
PersonActivity:onResume()->
MainActivity:onStop()->
此时点击图片控件->
PersonActivity:onPause()->
MainActivity:onRestart()->
MainActivity:onStart()->
MainActivity:onResume()->
PersonActivity:onStop()->
上述生命周期加粗处以及图片标记颜色处发现:启动目标Activity在Task栈中存在时,会直接启动已存在的Activity的实例复用,并且会销毁Task栈中在此Activity实例上的Activity实例。
在singlelInstance这种启动(加载)模式下,系统保证无论从哪个Task中启动目标Activity,只会创建一个目标Activity实例,并会使用一个全新的Task 栈来加载该Activity实例。
当系统采用 singleInstance模式启动目标Activity时,可分为如下两种情况。
需要指出的是,采用singleInstance模式加载Activity总是位于Task 栈顶,且采用singleInstance模式加载的Activity所在Task将只包含该Activity。
观察在singleInstance模式下对Activity生命周期的影响:
从图中可以看出,singleInstance模式下,启动MainActivity时,创建了Task,并将MainActivity的实例放入Task栈中(只有一个故位于栈顶);启动PersonActivity时,创建了新的Task,并将PersonActivity的实例放入新Task中(只有一个故位于栈顶),新Task位于前台,原Task置于后台;再启动MainActivity时,由于其之前已经存在,将其位于的原Task转入前台,因在栈顶,直接展示。
3月22日消息 外媒 Winfuture 报道,此前微软面向 Insider 预览用户公布了 Window...
橡皮擦一个逗趣的互联网高级网虫。 观前提醒本篇文章涉及知识点巨大建议先收藏再...
2月23日消息 据外媒 Windows Latest 今日报道,借助 Windows 10 Sun Valley 更新...
Greediness(贪婪型):最大匹配 X、X*、X+、X{n,} 是最大匹配。例如你要用 “....
1 . 目标 演示下图的git reset 各选项的效果。 2. Git Reset操作说明 图中说明:...
这些日子一直在简书上使用markdown写作,已经渐渐的痴迷于这种简洁纯粹的写作方...
本文实例讲述了正则表达式中的操作符及说明。分享给大家供大家参考,具体如下: ...
从另一台机器上复制过来的项目,由于两台机器的库目录不一致,导致了stdio.h等很...
ajax 实现三级联动,相当于写了一个小插件,用的时候直接拿过来用就可以了,这里...
Go原生就支持连接数据库,所以在使用 Golang 开发时,当需要数据库交互时,即可...