在Android中每个界面都是一个Activity,切换界面 *** 作其实是多个不同Activity之间的实例化 *** 作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Android总Activity的启动模式分为四种:
Activity启动模式设置:
<activity android:name=".MainActivity" android:launchMode="standard" />
Activity的四种启动模式:
1. standard
模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。
2. singleTop
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
3. singleTask
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
其中standard是系统默认的启动模式。
下面通过实例来演示standard的运行机制:
1 private TextView text_show
2 private Button btn_mode
3
4 @Override
5 public void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState)
7 setContentView(R.layout.activity_main)
8
9 text_show = (TextView) this.findViewById(R.id.text_show)
10
11 text_show.setText(this.toString())
12
13 btn_mode = (Button) this.findViewById(R.id.btn_mode)
14
15 }
16
按钮单击事件
17 public void LaunchStandard(View v){
18 startActivity(new Intent(this,MainActivity.class))
19
20 text_show.setText(this.toString())
21 }
如何设置Activity的启动模式Activity的四种启动模式:standard:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。 singleTop: 如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放...
android 主activity用什么启动模式
在android里,有4种activity的启动模式,分别为:
“standard” (默认)
“singleTop”
“singleTask”
“singleInstance”
1. 如何决定所属task
“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
2. 是否允许多个实例
“standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;
“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。
singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
3. 是否允许其它activity存在于本task内
“singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。
而另外三种模式,则可以和其它activity共存。
4. 是否每次都生成新实例
“standard”对于没一个启动Intent都会生成一个activity的新实例;
“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。
比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
“singleInstance”是其所在栈的唯一activity,它会每次都被重用。
“singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。
当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法
如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。
总结如下:
standard 每次都会新建,每个Task都可以有,且每个Task都可以有多个实例(每个Task都可以有,且可以有多个)
singleTop 当前实例如果在栈顶,就不新建实例,调用其OnNewIntent。 如不在栈顶,则新建实例 (每个Task都可以有,且可以有多个,在栈顶时可复用)
singleTask 新建一个Task,如果已经有其他的Task并且包含该实例,那就直接调用那个Task的实例。(只有一个Task中会有)
singleInstance 新建一个Task,且在该Task中只有它的唯一一个实例。 (只有一个Task会有,且该Task中只有它)
FLAG_ACTIVITY_NEW_TASK 类似singleTask
FLAG_ACTIVITY_SINGLE_TOP 类似singleTop
FLAG_ACTIVITY_CLEAR_TOP 无对应
Android开发,activity的默认启动模式为标准启动模式,什么时候会用到其他的启动模式?启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;
启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;
讲解启动模式之前,有必要先了解一下“任务栈”的概念
一 :
standard 模式:这个就没有什么好说的了,Android默认Activity启动的模式 就是 standard,如果有3个 Activity,Act1,Act2,Act3, 如果从Act1 启动到Act2 ,在启动到Act3,那么Android 的任务栈(task stack)分别为 Act1、Act2、Act3,Act3 在栈顶,如果此时按手机返回键,则需要返回3次才能返回到桌面(假设是从桌面启动的demo),任务栈分销毁掉 Act3,Act2,最后Act1 。
二 :singleTop模式:
实验效果:
singleTop模式:该启动模式和standard模式相差不多,任务栈分配也很相似,如:现有 act1,act 2,在act2 清单文件中配置 android:launchMode="singleTop" ,其他都是默认standard 模式, 若从桌面启动该实验demo,从act 1,到act2 ,那么任务栈则分配为,act1,act2,此时该任务栈和 standard 模式任务栈分配则完全相同,接下来则说明不同的地方,如果在act2 界面中 启动 到act1, 此时的 任务栈 情况则为 act1,act2,act1,在由act1 启动到act2,在启动到act2,进行多次启动,(在act2界面)任务栈的情况则为,act1,act2,act1,act2,栈顶的act2 则不会重新创建,则会复用act2 该 Activit, 依次类推。
理论知识:
singleTop,如果任务栈的栈顶元素是要被激活的组件,不会创建新的Activity放在任务栈,而是会复用栈顶的Activity。 如果发现栈顶的元素不是要激活的Activity,就会创建新的Activity 放置到任务栈里面
singleTop模式应用场景 :
App程序中(或浏览器中)保存的书签,假如用户看到一个界面保存自己喜欢的标签,假如要保存10个,这个时候用户在返回键的时候,则会返回10次才能返回到App应用中, Android下singleTop 则解决该问题。
三 singleTask 模式 :
实验效果 相差不大,实验内容就不多说了,自己可以写个小demo,两个Activity,每个Activiy 有两个button,可以相互启动 打日志去动手查看,会理解更加深刻,可以参照着 SingleTop模式去实验,以下只是讲解下 和SingleTop的区别:
区别如下:(理论知识)
SingleTask *** 作模式,一般和singleTop *** 作模式类似,如果他发现任务栈里面已经有了要启动的这个Activity,他会清空这个Activity所在的任务栈上面的所有Activiy,然后直接复用这个已经存在的Activity 。
应用场景:
如果一个App中,有一个功能需要加载网页内容 ,打开一个 browserActiviy现在网页内容,则内存开销非常大,首先要初始化webkit /c++ 嵌入式浏览器内核broweractivity 配置了singleTask,空间换时间,使用该模式可以节省内存开销。
四 :singleinstance 模式 :
直接理论知识吧”:
singleInstance *** 作模式会新开启一个任务栈,跟其他普通Activity不是 同一个任务栈,比较牛,他的模式流程是 首先要新开启一个新的任务栈把要激活的Activity放置到新的 任务栈里,这个任务栈里面只有且 只有一个实例,也比较极端吧。说比较极端也跟他的应用场景有关系。
应用场景 :
App各种词典,向有道词典,什么金山词典,说极端是因为不想被放置到同一个任务栈里面,它是全局的系统程序应用,达到节省内存的使用目的。
win7 系统 怎么设置uefi启动模式存有ghost版win7系统iso镜像文件的u启动uefi u盘启动盘插在电脑u *** 接口上,然后重启电脑,在出现开机画面时用一键u盘启动快捷键的方法进入到启动项选择窗口,然后将光标移至UEFI:开头的项(注意:一定要选择该项),按回车键执行等待进入到u启动win pe系统,u启动装机工具会自动开启,并加载到u启动uefi u盘启动盘中准备的win7系统安装程序,点击选择c盘为系统安装盘,再点击“确定”按钮继续
随即会d出一个询问是否执行该 *** 作的提示窗口,点击“确定”按钮执行 *** 作
然后耐心等待win7系统释放完成并自动重启电脑即可
电脑重启后会完成系统后续程序安装应用,直到进入win7系统桌面即可
android开发 activity启动模式中singleTop的疑问楼主的这一段理论似乎有点不太准确 “在D完成 *** 作以后,我启动了系统内置的浏览器E,根据sdk的说法,浏览器E被放进了一个新任务。那么现在有两个任务” 你凭什么确定浏览器E被放进了一个新的Task呢? 在启动浏览器E的Intent里设置了flag? intentandroid开发 activity启动模式中singleTop的疑问
android-Android activity 的启动模式.新人提问,大侠在哪Activity的四种启动模式:standard:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
singleTop: 如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
singleTask:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
singleInstance:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 属性。
不知道你要问什么,为你解答
activity的启动模式有哪些Activity的四种启动模式:standard:这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。
singleTop: 如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
singleTask:如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
singleInstance:在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
位置在 AndroidManifest.xml 文件中 Activity 元素的 android:launchMode 属性。
上篇总结了Activity的一些知识,现在继续对Activity的知识进行梳理,包括Activity直接传递数据,Activity的生命周期,Activity的启动模式等.1.intent传递数据:
使用startActivity方法,intent的putExtra()方法,以键值对的形式传递数据,该方法有很多重载方法,可以根据传递数据的不同类型选择合适的方法.除了有putExtra()方法外,还有putExtras()方法,传递的参数是Bundle.
如果传递的是对象,这个对象要实现序列化,也就是实现Parcelable或者Serializable接口.
如果希望被启动的页面返回数据,需要使用startActivityForResult()方法,这个方法中需要设置访问号,用来区分不同的访问者.并且在启动页重写onActivityResult方法用来接收返回的数据,
2.两种情况下的Activity的生命周期.
正常情况下的生命周期,正常情况是指用户的正常 *** 作下的Activity的生命周期.后面会分析异常情况下的生命周期.
onCreate: Activity第一次创建时候的回调,主要是在这个方法进行初始化工作,比如初始化控件和事件绑定工作.
onStart:Activity从不可见状态变成可见状态.
onResume:Activity变成前台,可以和用户交互.
onPause:Activity可见但是不能和用户交互.
onStop:Activity从可见变得不可见,成为后台Activity.
onDestroy:Activity销毁时调用.
onRestart:Activity从后台变成前台Activity.
在启动Activity和两个Activity之间跳转时,可以知道Activity的生命周期变化过程,有两个说明:(1)在两个Activity跳转时,第一个Activty的onPause,onStop方法和第二个Activity的生命周期方法调用时机.
第一个Activity先执行onPause方法,第二个Activity才能创建.这也就意味着在onPause方法中不能执行太耗时的 *** 作,否则会影响第二个Activity的创建.在源码(ActivityStack)中有这样的注释:
(2)onStart和onResume,onPause和onStop这两对方法的实质不同处:onStart和onStop这两个方法是从Activity的可见性来区分的,onResume和onPause是从Activity是否处于前台,是否可以和用户交互来区分的,注意在onPause调用时Activity还是可见的,调用时机比如d出dialog时,下面的Activity是可见的.这个时候调用的是onPause方法.
异常情况下Activity的生命周期:异常情况下是指资源相关配置发生变化或后台Activity被系统回收时Activity的生命周期.后台Activity被系统回收的情况比较难复现,在资源相关配置发生变化时和后台Activity被回收时的生命周期执行过程是一样的,比较容易复现的就是横竖屏切换时的生命周期执行过程.在 AndroidManifest的Activity组件下配置android:screenOrientation标签,当设置可以横竖方向随着方向感应器来调节时,在切换时会出现先销毁Activity再创建的过程.
过程:
在这种情况下有可能会有数据的丢失,系统提供用来保存数据和还原数据的方法:onSaveInstanceState和onRestoreInstanceState.用方法参数Bundle可以保存和还原数据.
可以根据需要设置android:screenOrientation标签,设定activity的方向,如果activity的方向是需要横竖屏切换,但是不容许销毁Activity,可以设置如下标签,当这些情况(常用的)发生变化是不会重新走Activity的生命周期方法,只会调用onConfigurationChanged,可以根据情况在这个方法里更新 *** 作.
切换时的log输出
3.Activity的四种启动模式
标准:是Activity的默认启动模式,对于AndroidManifest的Activity节点下的android:launchMode="standard"标签.
特定:每次启动都会重新创建新的Activity.
singleTop:对应的AndroidManifes的Activity节点下的android:launchMode="singleTop"标签
特点:当此模式的Activity处于栈顶时,不会重新创建新的Activity,会调用onNewIntent方法,如果更新Activity的intent,需要调用 setIntent()方法,具体的生命周期过程
singleTask:在activity栈中已经有需要再启动的activity时,会先清除位于需要启动activity之上的activity,例如:启动顺序mainActivity-activityA -activityB-activityA,其中activityA是singleTask的启动模式:
singleInstance:在一个栈中单独存在的activity.
关于activity栈:是指用来管理activity一种"先进先出"的队列结构,查看activity对应栈的方法:Activity的getTaskId()方法,同一个栈的id值是相同的.adb shell dumpsys activity在终端查看栈结构,比如还是上面的activity启动顺序,不同是ActivityA这是设置成singleInstance,这是的栈结构:有两个TaskRecord,其中ActivityB和MainActivity位于同一个栈中.
4.Activity开发中使用技巧:
<1>定义一个父Activity,在创建新的Activity时继承这个activity即可,将一些activity的公共设置可以设置在父activity中,比如获取每个Activity的名字,设置activity的窗体属性,同一管理activity的生命周期等,
<2>在启动的activity中定义静态方法,启动条件会显而易见:
<3>管理activity类,用来一键退出app.在父类Activity的创建和销毁时用来添加和移除Activity,在需要一键退出的地方调用静态finishAllActivity方法.
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)