LauchMode(Activity的启动模式)
来源:互联网 发布:java邮箱格式验证方法 编辑:程序博客网 时间:2024/06/05 09:33
什么是task:
A task is a collection of activities that users interact with when performing a certain job. The activities are arranged in a stack (the back stack),用户在完成某项功能活动时,开启的所有activity的集合称作一个task,这些activity在堆栈中有序排列(按照activity开启的顺序排列),最前面的直接与用户互动的activity为堆栈的最顶端,按back返回键时,最前面的activity会关闭销毁,次高位的activity会跳到堆栈的最前面; 当开启程序的第一个activity时,也就开启了一个task(每个task都有自己的stack),当最后一个activity也destroy时,task也就结束了当用户已经开启了程序A时,task A也就开始了, 这是用户通过home键开启程序B时,系统会创建task B(并同时创建task B的stack),task A进入后台,失去焦点,用户可以通过再次点击程序A的icon或者在recents Screen中选择程序A来将task A至于前景获得焦点tips:当后台 task 太多系统内存不足时,会自动kill按照task开启的顺序的最先开启的tasks,导致activity的状态丢失
task中stack管理:
- 当ActivityA开启ActivityB时,ActivityA停止并调用onStop()方法,系统会自动保存activityA的状态(滚动条滚动的位置,UI的状态等),当按下backButton,activityA回到前景恢复并调用onResume()方法UI状态也恢复到之前系统保存的样子, - 当用户按homeButton时,当前activity会停止调用onStop()方法,当前task会进入到后台,当通过点击程序图标,最次将task调到前景时,堆栈最顶端的activity恢复调用onStart()-onResume()方法,并恢复系统记录的UI状态 - 当用户通过backButton 关闭销毁当前的activity时,当前activity 调用onPause()-onStop()-onDestroy()方法,系统将不再保存当前activity的UI状态,stack中次高的activity进入到前景恢复调用onRestart()-onResume()方法,并恢复系统记录的UI状态
设置Activity的启动模式方法:
- 方法一:在manifest中设置(该方法可以被第二种方法覆盖)
<!--通过activity的android:lauchMode属性来设置--> <activity android:name=".MainActivity" android:label="@string/app_name" android:launchMode="singleInstance" >
(1).standard: 标准模式(默认模式)每次启动该activity都会创建一个新的实例;
(2).singleTop:栈顶单例模式,如果该activity有一个实例在栈顶,则再次启动时不会创建一个新实例,而是调用
该栈顶 实例的onNewIntent()方法,如栈顶不是该activity的实例,则会重新创建一个该activity的新实例;
(3).singleTask;首次开启该activity时,系统会自动开启一个新task,并在新task中实例化该
acitivity,如后台task中已存在该activity实例,则以后每次调用都将后台的task调到前台并调用该activity
的onNewIntent()方法来代替创建实例,该后台task具有自己的backStack,那么整个backStack也会出现在当前任务stack的顶部。
(4).singleInstance,与singleTask一样,不同点是:系统不会将其他的activity的实例放置在有该activity的task中。该activity始终是其task的单一且唯一成员,由该activity启动的其他的activity都另一个单独的task中开启。
- 方法二:通过设置开启activity的intent的Flag
Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);//为intent添加启动模式(可覆盖在manifest中的模式设置) Intent.FLAG_ACTIVITY_NEW_TASK; //在一个新task中开启这个activity实例,如后台已经存在已经包含这个activity的一个实例的task,这不创建新的task,将后台的那个task调动至前景,该activity实例移动至该task的stack的顶端回调onNewIntent()方法,并恢复系统自动保存的该activity的UI状态——>与singleTask的作用一致 Intent.FLAG_ACTIVITY_SINGLE_TOP; //与singleTop的作用一样,该task中若stack顶端已经存在该activity实例则直接调该activity的onNewIntent()方法而不会创建新实例,若顶端不是该activity实例,则会创建一个新的实例 Intent.FLAG_ACTIVITY_CLEAR_TOP; //当该task中存在该activity的实例时,再次开启会将stack中排在该activity实例上面的其他activity实例全部销毁,此时该activity实例排在stack顶端回调onRestart()-onResume()-onNewIntent()方法,恢复该activity的系统保存的状态,可与其他Flag或者manifest中的lauchmode结合作用 Intent.FLAG_ACTIVITY_NEW_DOCUMENT; //代替过时的FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET当当前的task从后台返回前景时,该intent开启的activity将不存在于stack记录中(该设置主要用于应用程序开启其他程序的activity后返回stack中的activity时可以跳过其他程序的activity) startActivity(intent);
affinity 亲密关系(表示该activity是属于哪一个task,具有相同taskAffinity属性值的activity处于同一个task中)
默认的来自同一应用程序的所有活动都具有同一种亲密关系(既来自同一个应用程序的所有activity都处于同一个task中)可以在manifest中修改亲密关系,使得来自不同程序的activity同处于一个task中,同一个程序的activity处于不同的task中
<activity android:name=".MainActivity" android:taskAffinity=""> <!--taskAffinity的值必须是唯一的字符串,默认值为在manifest中声明的包名,系统通过默认的affinity识别来自同一个application的activity具有相同的亲密关系(既处于同一个task中)-->
taskAffinity的作用环境(没有以下作用环境,taskAffinity将不具有作用):
当startActivity(intent),设置intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);时,**开启该activity时,设置该Flag时系统会搜寻是否存在和这个activity的taskAffinity相同的后台task存在,若存在则该activity的新的实例将会被放置到这个task中,若没有相同taskAffinity的后台task存在,系统会创建一个新的task来放置该activity的新实例**
当activity在manifest中设置属性allowTaskReparenting为true时; <activity android:name=".MainActivity" android:allowTaskReparenting="true">//activity实例可以从它开始的task,转移到和它taskAffinity属性相同的任务中去,(当用户用程序A中的activityA 启动程序B中的activityB时,若activityB的allowTaskReparenting设置为true,则,用activityA 启动activityB时,activityB的实例将放置在taskA中)
清除堆栈管理(Clearing the back stack)
当task处于后台长时间无操作时,系统会默认自动清楚除了根activity之外的所有的activities,当用户再次将这个task置于前景时,只有root activity的状态被保存,可以通过属性来改变堆栈的清除
- 当在task的root activity的manifest中设置属性alwaysRetainTaskState为true时,系统向不会自动清楚该task中的所有activities
<activity android:name=".MainActivity" android:alwaysRetainTaskState="true">
- 当在task的root activity的manifest中设置属性clearTaskOnLaunch为true时,一旦task进入后台系统就会立刻清除除了root activity之外的所有activities(与alwaysRetainTaskState相反)
<activity android:name=".MainActivity" android:clearTaskOnLaunch="true">
- 当在task中的任何activity(包括root activity)的manifest中设置属性finishOnTaskLaunch为true时,一旦task进入后台系统就会立刻清除该activity,(属于单个activity作用,而不是作用于整个task)
<activity android:name=".MainActivity" android:finishOnTaskLaunch="true">
开启task的入口
intent-filter 为开启root activity的入口,同时也是返回task的方法,若task中没有intent-filter,task进入后台后将没办法在转入前景,
<activity ... > <intent-filter ... > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
- LauchMode(Activity的启动模式)
- Activity启动模式(lauchMode)
- Activity启动模式(lauchMode)
- Activity启动模式(lauchMode)
- Activity启动模式(lauchMode)
- Activity启动模式 lauchMode
- android中Activity的四种启动模式(lauchmode)
- 安卓开发42:lauchMode Activity的启动模式
- Android总结篇系列:Activity启动模式(lauchMode)
- Android总结篇系列:Activity启动模式(lauchMode)
- Android初学习 - Activity启动模式(lauchMode)总结
- Android总结篇系列:Activity启动模式(lauchMode)
- Android总结篇系列:Activity启动模式(lauchMode)
- Android总结篇系列:Activity启动模式(lauchMode)
- Android 之Activity启动模式之 lauchMode
- 完全理解android Activity启动模式LauchMode (深入Activity与任务栈)
- 完全理解android Activity启动模式LauchMode (深入Activity与任务栈)
- Android 之Activity启动模式(一)之 lauchMode
- 苏宁易购倒计时加封装js
- 《CSS权威指南》读书笔记6
- 猜字母小游戏
- 前端学HTTP之实体和编码
- 参照MyEclipse/eclipse设置notepad++的快捷键
- LauchMode(Activity的启动模式)
- Libevent编程-捕获 signal
- Android The specified child already has a parent.解决方法
- 6.1.1Drv/Serial(Character Device Drv)
- Android System Server进程源码分析 上
- 机器视觉
- 从零写一个线程切换工具
- Non-overlapping Intervals
- springBoot上传文件大小设置