图片 7

温故而知新-Android四大组件之Activity

Activity生命周期精髓图解:

Activity简介

Activity是Android三个老大重大的客商接口(四大组件之一State of Qatar,是可以知道的,首若是客户和应用程序之间举行彼此的接口。在种种Activity中都能够放比超多控件,所以也足以把Activity看作控件的容器。它肩负了大家的界面突显,实际支出中大家通过setContentView(CRUISER.layout.idState of Qatar设置分界面显示的视图。在Android的品种构造划假造计中,Activity就也就是MVC设计格局中的View层。在Android的四大组件设计中,为了便利开荒者举办开垦使用,Android的开拓者对四大组件通过生命周期实行拘禁,我们只需求世襲Activity进行重写这么些生命周期来治本和合理性运用Activity。

Activity栈

android系统应用栈的法子对activity实行田间管理:

图片 1

Paste_Image.png

运用后进先出原则,新访问的activity放在栈顶,再次回到时从栈顶移除activity。栈顶的activity处于激活状态,能够与客商人机联作,其日后的activity处于停顿状态,但保留了界面组件的脚下情状,重回后又会还原。

每种activity持有二个属性taskaffinity(能够在manifest文件中装置),表示activity之间的相关性,暗许activity的taskaffinity为使用的包名。

图片 2

Paste_Image.png

同一个Task下的activity不自然都在一道,中间有比不小希望有别的Task的activity。

当按“home”键后那几个任务会切换来后台,点击桌直面应应用的icon后,相应的天职又会切换成前台。

图片 3

Paste_Image.png

经过命令行语句:
adb shell dumpsys activity activities
可以查看Activity的连锁新闻富含affinity和task

图片 4

Paste_Image.png

图片 5

Paste_Image.png

图片 6

先是要注册一个Activity项目清单配置
  <application android:allowbackup="false"   
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name"    
    android:roundicon="@mipmap/ic_launcher_round" 
    android:supportsrtl="true" 
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
       <intent-filter>
          <action android:name="android.intent.action.MAIN"/>
        <category  android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
    </activity>

启航格局之lanchMode

能够在manifest中配置activity的开发银行格局lanchMode,activity支持4中运营方式:

  • standard
    她是暗中认可情势,在该情势下activity能够享有两个实例,那么些实例能够置身贰个或八个task中。
    比如:
    1、在A应用中往往早先standard格局的activity1,则会创建四个activity1实例,由于都没设置taskaffinity,他们都归属同八个任务TaskA。
    2、在B应用中运维A应用的activity1,则那么些activity1归属B应用的天职TaskB。
  • singleTop
    在该情势下,同叁个task中,倘诺存在该Activity实例,况且在栈顶,则不再创立新的Activity实例,而是调用其onNewIntent(卡塔尔(قطر‎方法,不可是开立异的activity实例。
  • singleTask
    表示只只怕有一个带有该Activity实例的task存在。
    比方ActivityB的起步格局为singleTask:
    1、若是activityA和B的taskAffinity一样,第壹次创设ActivityB,会创立一个新的ActivityB实例,何况归于同多少个Task中。若是存在ActivityB,则会去除其上述的具有Activity,然后跳转到ActivityB。
    2、假诺activityA和B的taskAffinity不雷同,第三次创设ActivityB,会判断与B的taskAffinity相关的Task是不是存在,不设有则创立新的Task,把ActivityB增多进去,固然存在相关的Task,那把ActivityB加多在这里个Task中;假使存在ActivityB,则把那个Task中ActivityB之上的Activity都剔除,然后跳转到ActivityB中。
  • singleInstance
    即只允许存在独一叁个Activity实例,并且该Activity所在的Task只可以有她叁个Activity实例。与singleTask近似,只可以有一个实例。跳转到singleInstance方式的Activity,倘若子虚乌有,则成立二个task,增添activity;假若存在,则直接跳到这些activity。

按钮对生命周期的熏陶:

各自参数解释

1.allowBackup:是不是同意备份应用的多少,当备份数据的时候,它的多寡会被备份下来。假如设为false,那么相对不会备份应用的数量,固然是备份整个体系,默许是true。

2.icon&roundIcon:今后Android新建项目后会自动安装五个Logo,icon和roundicon,叁个是日常Logo,叁个是圈子Logo。

3.supportsKugatl:表明你的application是或不是情愿援助从右到左(原本RTL就是right-to-left
的缩写…卡塔尔的构造,如若设置为true,targetSdkVersion设置为17或更加高,种种RTL的API将被激活,系统接受你的应用程序能够来得RTL结构。若是targetSdkVersion设置为16或更低的装置为false,RTL的API将被忽略或还未影响你的应用程序将富有相像的表现无论对顾客现场的选拔有关的构造方向(你的构造会从左至右),此属性的暗中同意值是false。

4.activity :注册的Activity

5.intent-filter:过滤器intent-filter 设置action
=”android.intent.action.MAIN”、category
=”android.intent.category.LAUNCHE福睿斯”
,意思就是安装MainActivity为app的入口函数。

起步格局之flag

当跳转activity时,能够因此设置intent的flag,设置activity的跳转方式,flag的前期级比manifest中配置的lanchMode更高。
常用的4中flag:

  • FLAG_ACTIVITY_NEW_TASK
    在合乌克兰语档中牵线,他与lanchMode=singleTask相似,实际上并不别无二样,需求与FLAG_ACTIVITY_CLEAR_TOP结合才与singleTask同样。单独使用会有大多出人意料的场合,达不到大家的意料。
    比如:
    1、假如跳转的连个ActivityA和B在同二个task中,FLAG_ACTIVITY_NEW_TASK未有此外成效,多次用那么些flag跳转ActivityB,会创立五个ActivityB实例。
    2、ActivityA和B的taskAffinity不一致,跳转到ActivityB,A和B在不相同的task中,当在ActivityB的Task中,跳转到同个Task中的ActivityC,再要跳转到ActivityB,会未有其余反响。因为ActivityB实例已存在,可是他无处的task的栈顶是activityC,FLAG_ACTIVITY_NEW_TASK又不会删除activityB只上的Activity,全部未有发出跳转。

  • FLAG_ACTIVITY_SINGLE_TOP
    她与lancheMode=singleTop具有想用的的行事。

  • FLAG_ACTIVITY_CLEAR_TOP
    解除activity所在task中,坐落于该activity之上的保有activity,假若activity的运转形式是私下认可的,则该activity会finished掉,再起步贰个新的activity;假设不想再次成立八个activity,则要再增多FLAG_ACTIVITY_SINGLE_TOP。

  • FLAG_ACTIVITY_CLEAR_TASK
    杀绝已存在Activity所在task中的全体activity,activity将形成三个空栈中新的最底端的activity须求与FLAG_ACTIVITY_NEW_TASK联合起来能力运用,不然未有效果与利益。

BACK键:

下边大家来协作看看Android官方文书档案上提供的Activity的生命周期图:

图片 7

Activity生命周期图

当大家按BACK键时,大家以此应用程序将告竣,那个时候咱们将前后相继调用onPause(卡塔尔->onStop(卡塔尔国->onDestory(卡塔尔(قطر‎四个措施。

措施介绍
  • onCreate()方法
    这么些主意大家必得兑现,当大家创立二个activity的时候,系统会调用这一个艺术。首要的是,大家亟须通过setContentView(卡塔尔(قطر‎来设定activity的展现视图。(不可以看到)

  • onStart()方法
    在大家创立了视图之后调用,在向顾客显示以前调用。然后调用onResume方法。(不可以看到)

  • onResume()方法:
    onResume方法是activity实行可以预知状态,能够与顾客进行相互影响。(可以预知可用)

  • onPause()方法
    当我们离开那些activity时候系统调用那个方法。注意:它不表示activity被销毁(destroy卡塔尔(قطر‎。暂停状态,记得儿时打游戏,按暂停,游戏分界面就能够告一段落不动,归于可以知道状态,可是无法用,其实原理基本相似。(可以知道但不可用)

  • onRestart:Activity的重启,由不可知变为可见

  • onStop()方法
    终止状态,当多个activity被另一个activity完全覆盖的时候,它依然保留着音信,可是曾经对顾客不可知。(不可以预知)

  • onDestroy()方法
    那时候activity已经被销毁,activity至此生命周期完全终止。(销毁)

再度启航App时,会实践onCreate(State of Qatar->onStart(卡塔尔(قطر‎->onResume(卡塔尔国

注意点
  • 中间onCreate和onDestory为完整的生命周期,onStart和onStop为可以看到生命周期,onResume和onPause为前台湾学子命周期。

  • 当客商张开新的Activity或切换回到桌面包车型客车时候,回调为onPause->onStop,可是若Activity选用的为透明宗旨,则不会回调onStop。

  • 诚如景观下,Activity有不可以预知变为可以知道,onRestart才会调用。

  • onStart和onStop调整Activity在可以预知和不可以看到的事态之间转变,onResume和onPause调整Activity在前台或非前台之间转移。

  • 当由Activity A ->Activity
    B时,回调的顺序为onPause(AState of Qatar->onCreate(B)->onStart(B卡塔尔(قطر‎->onStop(AState of Qatar,由此无法在onPause上做重量级操作。

  • 假设利用长日子处于stopped状态何况那个时候系统内部存款和储蓄器极为不安的时候,系统就能够回笼Activity,那时系统在回笼在此以前会回调onSaveInstanceState方法来保存应用的数额Bundle。当该Activity重新创建的时候,保存的Bundle数据就能够传送到onRestoreSaveInstanceState方法和onCreate方法中,那正是onCreate方法中Bundle
    savedInstanceState参数的源于(onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也得以选拔在onCreate方法中做多少复苏)。

HOME键:

测量试验Activity的生命周期:
  1. 界面从“死亡”–>“运行”
    构造器–>onCreate()—>onStart()–>onResume()

  2. 界面从“运行”–>“死亡”
    onPause()–>onStop()–>onDestroy()

  3. 界面从“运行”–>“停止”
    onPause()–>onStop()

  4. 界面从“停止” –>“运行”
    onRestart()–>onStart()–>onResume()

  5. 界面从“运行”–>“暂停”
    onPause()

  6. 界面从“暂停” –>“运行”
    onResume()

在骨子里的费用中,大家遵照activity的生命周期来落到实处大家的逻辑管理。经常在付出中,在onCreate(卡塔尔方法中开展一些变量的最早化专门的学问,包含变量的初步化、控件的初始化、控件设置监听等。当二个activity由于错失焦点时再度重复赢得关节调用onResume方法。在onResume(State of Qatar方法中大家能够拍卖局地诸如分界面包车型大巴翻新操作。

当我们开拓应用程序时,举个例子浏览器,小编正在浏览National Basketball Association信息,见到八分之四时,笔者遽然想听歌,当时我们会挑选按HOME键,然后去开采音乐应用程序,而当大家按HOME的时候,Activity前后相继实践了onPause(State of Qatar->onStop(State of Qatar那多个法子,此时应用程序并不曾消逝。

onSaveInstanceState几时调用

在activity被杀掉在此之前调用保存各种实例的意况,以确定保证该地方能够在onCreate(Bundle卡塔尔国或许onRestoreInstanceState(BundleState of Qatar(传入的Bundle参数是由onSaveInstanceState封装好的卡塔尔中平复。这么些方法在叁个activity被杀死前调用,当该activity在以后有个别时刻回来时得以回复其原先情状。比如,要是activity
B启用后放在activity A的前端,在某个时刻activity
A因为系统回笼财富的标题要被杀掉,A通过onSaveInstanceState将有机会保存其客商分界面状态,使得未来顾客重回到activity
A时能通过onCreate(Bundle卡塔尔只怕onRestoreInstanceState(Bundle卡塔尔(قطر‎复苏界面包车型地铁意况。

无须将那个主意和activity生命周期回调如onPause(卡塔尔(قطر‎或onStop(卡塔尔国搞混淆了,onPause(卡塔尔(قطر‎在activtiy被停放到背景或然电动销毁时总会被调用,onStop(卡塔尔(قطر‎在activity被消亡时被调用。一个会调用onPause(卡塔尔国和onStop(卡塔尔,但不触发onSaveInstanceState的事例是当顾客从activity
B重返到activity
A时:未有供给调用B的onSaveInstanceState(BundleState of Qatar,那个时候的B实例恒久不会被恢复生机,因而系统会防止调用它。八个调用onPause(State of Qatar但不调用onSaveInstanceState的例证是当activity
B运营并处在activity
A的前端:纵然在B的一体生命周期里A的客户分界面状态都并未有被弄坏的话,系统是不会调用activity
A的onSaveInstanceState(BundleState of Qatar的。

而当我们从桌面再度运转应用程序时,则前后相继分别实践了onRestart(卡塔尔(قطر‎->onStart(卡塔尔->onResume(卡塔尔(قطر‎多少个方式。

Activity优先级
  1. 前台Activity——正在和客商人机联作的Activity,优先级最高

  2. 看得出但非前台Activity——Activity中弹出的对话框招致Activity可以知道但力不能及交互作用

  3. 后台Activity——已经被中断的Activity,优先级最低

日常Activity切换平常生命周期(这里的肖似是指运行方式为standard,切换activity风还没加flag标识卡塔尔国:

Activity职责栈和多样运营方式

ActivityA启动ActivityB:

每种应用会有三个Activity义务栈,存放已开发银行的Activity
  • standard:私下认可的起步形式,该情势下会生成二个新的Activity,同期将该Activity实例压入到栈中(不管该Activity是还是不是已经存在在Task栈中,都是采取new操作)。譬喻:
    栈中逐条是A B C D ,这个时候D通过Intent跳转到A,那么栈中布局就改为 A B C
    D A,点击再次来到按键的 彰显顺序是 D C B A,依次摧毁。

  • singleTop:在singleTop格局下,借使当前Activity
    D坐落于栈顶,当时透过Intent跳转到它自身的Activity(即D),那么不会重复成立多少个新的D实例(走onNewIntent(卡塔尔(قطر‎),所以栈中的构造还是为A
    B C
    D,就算跳转到B,那么由于B不处于栈顶,所以会新建一个B实例并压入到栈中,布局就成为了A
    B C D B。应用实例:三条推送,点进去皆以一个activity。

  • singleTask:在singleTask格局下,Task栈中只好有三个对应Activity的实例。比如:以往栈的结构为A
    B C
    D,当时D通过Intent跳转到B(走onNewIntent(卡塔尔),则栈的布局变为了:A
    B。个中的C和D被栈弹出销毁了,也正是说坐落于B之上的实例都被销毁了。如若系统已经存在三个实例,系统就能够将呼吁发送到这么些实例上,但此时,系统就不会再调用平常状态下大家管理哀告数据的onCreate方法,而是调用onNewIntent方法。经常接收于首页,首页确定得在栈底部,也一定要在栈尾巴部分。

  • singleInstance:singleInstance情势下会将开拓的Activity压入一个新建的任务栈中。举个例子:Task栈1中构造为:A
    B
    C,C通过Intent跳转到了D(D的运营情势为singleInstance),那么则会新建贰个Task
    栈2,栈1中布局依然为A B
    C,栈第22中学协会为D,当时荧屏中呈现D,之后D通过Intent跳转到D,栈第22中学不会压入新的D,所以2个栈中的场地没发生改造。假使D跳转到了C,那么就能够遵照C对应的起步情势在栈1中举办相应的操作,C借使为standard,那么D跳转到C,栈1的布局为A
    B C C,那时候点击重回开关,依然在C,栈1的布局变为A B C,而不会回来D。

ActivityA 的生命周期onPause(卡塔尔(قطر‎->onStop(卡塔尔,

Intent Flag运转形式

intent 在跳转页面包车型客车时候能够设置intent.setFlags(卡塔尔

  • FLAG_ACTIVITY_CLEAR_TOP:例 如以后的栈意况为:A B C D
    。D当时透过intent跳转到B,借使那一个intent加多FLAG_ACTIVITY_CLEAR_TOP标识,则栈情状成为:A
    B。若无增多那些标识,则栈景况将会化为:A B C D
    B。相当于说,假若增加了FLAG_ACTIVITY_CLEAR_TOP标识,何况目的Activity在栈中已经存在,则将会把位于该指标activity之上的activity从栈中弹出销毁。那跟上面把B的Launch
    mode设置成singleTask相似。总体上看,跳转到的activity若已在栈中留存,则将其上的activity都销掉。

  • FLAG_ACTIVITY_NEW_TASK:例 如今后栈1的事态是:A B
    C。C通过intent跳转到D,并且那个intent加多了FLAG_ACTIVITY_NEW_TASK标志,要是D这一个Activity在
    Manifest.xml中的证明中增多了Task
    affinity,系统率先会搜索有没有和D的Task
    affinity肖似的task栈存在,如若有存在,将D压入那叁个栈,要是不设有则会新建一个D的affinity的栈将其压入。如若D的Task
    affinity私下认可未有安装,则会把其压入栈1,造成:A B C
    D,那样就和不加FLAG_ACTIVITY_NEW_TASK标识效果是一致的了。注意假若计划从非activity的格外渠道运行多个activity(例见下文“intent.setFlags(卡塔尔(قطر‎方法中参数的用例”),比如从二个service中运维多少个activity,则intent举个例子要增加FLAG_ACTIVITY_NEW_TASK标志(编者按:activity要留存于activity的栈中,而非activity的路线运转activity时必定不设有叁个activity的栈,所以要新起二个栈装入运营的activity)。简单的讲,跳转到的activity依据气象,恐怕压在叁个新建的栈中。

  • FLAG_ACTIVITY_NO_HISTO奇骏Y: 比方今后栈情况为:A B
    C。C通过intent跳转到D,这些intent增添FLAG_ACTIVITY_NO_HISTOOdysseyY标识,则当时分界面呈现D的源委,但是它并不会压
    入栈中。倘诺按再次回到键,再次来到到C,栈的意况或许:A B
    C。假设那个时候D中又跳转到E,栈的情状成为:A B C
    E,那时按重返键会回到C,因为D根本就不曾被压入栈中。综上可得,跳转到的activity不压在栈中。

  • FLAG_ACTIVITY_SINGLE_TOP:和Activity的Launch
    mode的singleTop雷同。倘若某些intent增加了那些标记,并且那个intent的靶子activity就是栈顶的activity,那么将不会新建三个实例压入栈中。不问可以知道,目的activity已在栈顶则跳转过去,不在栈顶则在栈顶新建activity。

ActivityB的生命周期onCreate(State of Qatar->onStart(卡塔尔国->onResume(State of Qatar。

Activity的启动

1、呈现运行
何为展现运维,正是在开创Intent的时钦点要运维的activity的类。所从前提是我们已经精通Activity的类名称,这就选用在大家在开拓app中进行activity的跳转。

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);

2、隐式运营
android系统给我们提供了无数服务,如打电话、发短信。可是在大家的利用中大家不晓得具体的activity类名称,那个时候我们就要求动用隐式的activity运维方法。

//打电话
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-2368"));
startActivity(intent);

//发短信
Intent intent=new Intent();
intent.setAction("android.intent.action.SEND");
intent.setData(Uri.parse("mms:110"));
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

//打开网页
Intent intent=new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);

ActivityB执行finish返回ActivityA:

有回调的跳转
/*
*ActivityA跳ActivityB
*/
Intent intnt = new Intent(this,ActivityB.class);
startActivityForResult(int reqCode, Intent intent): 带回调启动Activity

/*
*ActivityB销毁 返回ActivityA
/
 setResult(int resultCode, Intent data): 设置要返回的结果
 finish(): 结束当前Activity

/*
*ActivityA 接收之后ActivityB返回的参数
/
onActivityResult(int reqCode, int resultCode, Intent data): 回调方法
通过data获取返回的数据 进行操作

ActivityB的生命周期onPause(卡塔尔国->onStop(卡塔尔->onDestory(卡塔尔国

ActivityA的生命周期了onRestart(卡塔尔->onStart(卡塔尔国->onResume(卡塔尔国

留意:当ActivityB定义为Dialog样式时,ActivityA的生命周期是不肖似的,

我们给ActivityB加上theme

<style name="MyDialogStyle">  
      <item name="android:windowBackground">@android:color/transparent</item>  
      <item name="android:windowFrame">@null</item>  
      <item name="android:windowNoTitle">true</item>  
      <item name="android:windowIsFloating">true</item>  
      <item name="android:windowIsTranslucent">true</item>  
      <item name="android:windowContentOverlay">@null</item>  
      <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>  
      <item name="android:backgroundDimEnabled">true</item>  
  </style>

以那个时候候,ActivityA运维ActivityB,B未有完全遮挡A,ActivityB的生命周期跟刚刚一模二样,但是ActivityA并未进行onStop(卡塔尔

还会有一点点亟待极其注意,Activity中一贯弹dialog,Acitivity的生命周期是不会调换的。英特网有个不要讲法是会实践onPause(卡塔尔,其实并不曾施行!

除此以外还可能有多少个跟生命周期相关的不二秘籍

@Override  
  protected void onNewIntent(Intent intent) {  
      super.onNewIntent(intent);  
  }  

  @Override  
  protected void onSaveInstanceState(Bundle outState) {  
      super.onSaveInstanceState(outState);  
  }  

  @Override  
  protected void onRestoreInstanceState(Bundle savedInstanceState) {  
      super.onRestoreInstanceState(savedInstanceState);  
  }  

  @Override  
  public void onConfigurationChanged(Configuration newConfig) {  
      super.onConfigurationChanged(newConfig);  
  }

当使用运维起来后就能够张开一条线程,线程中会运营叁个义务栈,当Activity实例创制后就能够归入职务栈中。Activity运行情势的装置在AndroidManifest.xml文件中,通过配置Activity的性质Android:launchMode=””设置。

1. Standard模式(默认)

笔者们日常一直创制的Activity都以这种方式的Activity,这种情势的Activity的性状是:只要你创立了Activity实例,一旦激活该Activity,则会向任务栈中参预新成立的实例,退出Activity则会在任务栈中销毁该实例。

standard方式是所运维的Activity都以在同三个task容器栈下,不会另行创造新的task容器栈。先压入栈的Activity实例按顺序入栈底,后入栈在栈顶,处于栈的顶端Activity实例处于活动状态,别的处于非活动状态。按物理重回键,退出当前所处活动状态Activity窗口,那样就能够从task容器栈中弹出,显示在大哥大主显示器上,从而,有非活动状态调换来活动的景色。其次,standard容器栈可能会设有着平等的Activity实例,独有没调用三次startActivity方法,就可以创建指标Activity实例对象压入task容器栈。

假若Activity运转顺序为A->B->B->A->D,栈中的Acitivy为ABBAD(最早创设的A位于栈底,最终创设的D坐落于栈顶卡塔尔

2. SingleTop模式

这种格局会思忖当下要激活的Activity实例在职分栈中是或不是正处在栈顶,要是处在栈顶则不须求另行创设新的实例,会引用已存在的实例,不然会在任务栈中创制新的实例。

SingleTop有个准确的用法是谨防屡次点击创造八个Activity,无论start四次,SingleTop方式能保证栈顶独有八个实例。
借使Activity运维顺序为A->B->B->A->D,栈中的Acitivy为ABAD(当B放在栈顶时,再一次运营B的时候,B不会另行创造State of Qatar

3. SingleTask模式

假使任务栈中存在该形式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance(卡塔尔国方法重用该Activity,使该实例处於栈顶地方,不然就重新成立叁个新的Activity实例。

singletask情势,极其须求在意了。运行的对象Activity实比如果已经存在task容器栈中,不管当前实例处于栈的任何地方,是栈顶也好,栈底也好,如故处于栈中间,只要目的Activity实例处于task容器栈中,都足以引用该Activity实例对象,然后,把处于该Activity实例对象方面全部Activity实例消亡掉,而且,task容器栈中长久只有独一实例对象,不会存在三个相仿的实例对象。所以,假若你想你的施用不管怎么运营指标Activity,都唯有独一二个实例对象,就动用这种运营情势。
借使Activity运转顺序为A->B->B->A->D,栈中的Acitivy为AD(当A再度被运维时,A会被移到栈顶,坐落于A上面的Acitivity全体会出栈卡塔尔

4. SingleInstance模式

当该格局Activity实例在职分栈中成立后,只要该实例还在职务栈中,即假诺激活的是该品种的Activity,都会因此调用实例的newInstance(卡塔尔方法重用该Activity,那时候应用的都以同二个Activity实例,它都会处于职责栈的栈顶。此形式相同用来加载异常的慢的,相比较耗质量且不须求每回都再度创制的Activity。

singleInstance运行情势,轻便说就是能够分享有个别Activity。举个例子,应用1的天职容器栈中创造了MainActivity实例,应用2也要激活MainActivity,则不供给创设MainActivity实例,直接可以公用MainActivity实例。
尤其值得注意:应用1开发银行MainActivity,按home键;张开应用2起步应用1的MainActivity实例。在按home键,张开应用1,这时应用1的分界面是理所应当是地处MainActivity分界面实例。
SingleInstance的多个任务栈中独有三个Activity,并保管不再有别的Activity实例进入。

特地要求专一的生命周期onNewIntent

当三个Activity被start,而无需再次成立时,就能够进行onNewIntent生命周期。若是一个Activity的起步形式是SingleTask,大家得以在onNewIntent中实践一些刷新操作等。

咱俩常常会把MainAcitivy设置为SingleTask,除了保证MainActivity的天下无敌,还足以行使singleTask的表征做一些清管事人业。自动管理栈,销毁无用的Acitivity.

Intent Flags

Flags:
表示Intent的标记位,常用于Activity的光景中,它和Activity的起步格局抱有紧凑的联络。
上边列举的是和本文主题相关的Flags属性:

Intent.FLAG_ACTIVITY_NEW_TASK (默认)

暗中认可的跳转类型,它会重新创建二个新的Activity,然则与这种景况,比如说Task1中有A,B,C多个Activity,那个时候在C中运维D的话,若是在AndroidManifest.xml文件中给D添加了Affinity的值和Task中的不等同的话,则会在新标记的Affinity所存在的Task中压入这些Activity。即使是暗许的要么钦赐的Affinity和Task同样的话,就和专门的学问情势同样了开发银行三个新的Activity.

FLAG_ACTIVITY_SINGLE_TOP

本条FLAG就一定于运维形式中的singletop,例如:原本栈中构造是A B C
D,在D中运转D,栈中的情况依然A,B,C,D。

FLAG_ACTIVITY_CLEAR_TOP

以此FLAG就一定于运维情势中的SingleTask,这种FLAG运转的Activity会把要开动的Activity之上的Activity全体弹出栈空间。比方:原本栈中的布局是A
B C D ,从D中跳转到B,栈中的构培育改为了A B了。

FLAG_ACTIVITY_BROUGHT_TO_FRONT

其一英特网广大人是如此写的。如若activity在task存在,取得最上方,不会运行新的Activity。那几个有希望会误导大家!
他以此FLAG其实是那一个意思!比如说小编今后有A,在A中运行B,那时候在A中Intent中增添那个符号。那时B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT格局运行,那时候在B中再运行C,D(平常运转C,D),要是这时在D中再起步B,那个时候最终的栈的事态是
A,C,D,B。假设在A,B,C,D不奇怪运转以来,不管B有未有用FLAG_ACTIVITY_BROUGHT_TO_FRONT运维,当时在D中运营B的话,依然会产生A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION

onUserLeaveHint(卡塔尔(قطر‎作为activity周期的一局地,它在activity因为顾客要跳转到别的activity而要退到background时采用。比如,在顾客按下Home键,它将被调用。比如有电话进来(不归于顾客的抉择),它就不会被调用。

那正是说系统怎样区分让前段时间activity退到background时行使是客户的挑选?

它是依据促使当前activity退到background的十一分新运行的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来规定的。

小心:调用finish(卡塔尔(قطر‎使该activity销毁时不会调用该函数

FLAG_ACTIVITY_NO_HISTORY

情趣便是用那一个FLAG运行的Activity,一旦退出,它不会存在于栈中,举个例子原来是A,B,C当时再C中以那么些FLAG运营D的,D再运维E,那时栈中情形为A,B,C,E。

Activity相关属性taskAffinity

Activity 中的 android:taskAffinity 这些性格介绍:

Activity为Task具有的一个affinity。具备同等的affinity的Activity理论上归于同一的Task(在客户的角度是一律的“应用程序”)。Task的affinity是由它的根Activity决定的。

affinity决定两件业务——Activity重新宿主的Task(参照他事他说加以考查allowTaskReparenting天性)和选拔FLAG_ACTIVITY_NEW_TASK标记运转的Activity宿主的Task。

暗中同意情形,贰个应用程序中的全数Activity都负有同等的affinity。捏能够设定这么些特点来组合它们,以致足以把区别应用程序中定义的Activity放置到平等的Task中。为了显明Activity不宿主特定的Task,设定该性格为空的字符串。

设若那么些脾气没有设置,Activity将从应用程序的设定这里世袭下来(参考<application>元素的taskAffinity性子)。应用程序私下认可的affinity的名字是<manifest>成分中设定的package名。

发表评论

电子邮件地址不会被公开。 必填项已用*标注