Activity的声明周期与启动模式

2 篇文章 0 订阅
1 篇文章 0 订阅

典型情况下的Activity生命周期

1.几个典型的声明周期

  • onCreate:做一些初始化工作,如setContentview加载页面布局资源,初始化activity所需数据。
  • onStart:Activity正在被启动,这时候activity已经可见了,但是还没有出现在前台因此无法和用户交互,因此我们是看不到它的。
  • onRestart:Activity被重新启动,activity由不可见状态重新变为可见状态,这时候onRestart会被调用。比如按home键切换到桌面或者跳转到其他activity,再次回来的时候就会调用这个方法。
  • onResume:activity已经可见并且在前台活动了,这时候可以和用户交互了,我们是可以看见它的。
  • onPause:标识activity正在停止,正常情况下紧接着onStop会被调用。此时可以做一些数据存储和停止动画的操作但是不能太耗时,否则会影响新的activity的显示,因为onPause执行完了才会执行新activity的onResume。
  • onStop:表示activity即将停止,这里可以做一些重量级的回收操作,但是同样不能太耗时。
  • onDestroy:表示activity即将被销毁,在这里可以做一些回收工作和资源的最终释放。

2.各个声明周期之间的切换:

  • 2.1一个正常activity启动,回调为onCreate--onStart--onResume
  • 2.2切换到新的activity或者桌面,回调为onPause--onStop,有一种特殊的情况是如果新的activity是主题透明的,那么当前activity是不会回调onStop的。
  • 2.3当再次回到原来的activity(回退或桌面切回),回调为onRestart--onStart--onResume。
  • 2.4当用户按back键回退时,当前页面的回调为onPause--onStop--onDestroy。
  • 2.5当activity被系统回收了,再次打开还是会走onCreate--onStart--onResume,但是并不是所有的回调流程都一样。
  • 2.6生命周期的配对,onCreate和onDestroy是配对的分别为activity的创建和销毁,分别只能被调用一次。onStart和onStop是配对的,这两个方法可能被多次调用。onResume和onPause是配对的,这两个方法也是可能被多次调用的。

3.声明周期切换的几个疑问:

  • 3.1 onStart和onStop与onResume和onPause这两个配对,从本质上讲有什么区别呢?
  • 其实这两个配对之间的差别是很微妙的,onStart和onStop是从activity是否可见这个角度来回调的,而onResume和onPause是从activity是否位于前台的这个角度来回调的。
  • 3.2 先打开activity A,接着打开activity B,那么activity B的onResume和activity A的onPause谁先执行呢?
  • 从源码角度分析可知,在新的activity启动之前,栈顶的activity必须先onPause,新的activity才能够启动。

异常情况下的Activity生命周期

1.情况一:资源相关的系统配置发生了改变,导致Activity被杀死并重新创建

销毁过程:当横竖屏切换系统配置发生改变时Activity会被销毁并重新创建,销毁时onPause、onStop和onDestroy均会被调用,同时时onSaveInstanceState和onRestoreInstanceState会先后被调用。onSaveInstanceState来保存当前activity的状态,它的调用时机是在onStop之前但可能在onPause之前也可能在onPause之后。onSaveInstanceState只有在activity被异常中止的时候才会调用,正常情况下是不会被调用的。

重新创建恢复过程:当activity被重新创建时onRestoreInstanceState会被调用,并且把销毁时onSaveInstanceState方法所保存的bundle对象作为参数传递给onCreate和onRestoreInstanceState方法。因此可以在onCreate和onRestoreInstanceState里面判断activity是否被重建了,如果重建之前保存的数据需要恢复,onRestoreInstanceState调用时机在onStart之后。系统会为默认恢复一些数据,具体由activity和每个view的onSaveInstanceState和onRestoreInstanceState方法决定。

2. 情况二:资源内存不足导致优先级比较低的Activity被杀死。

这种情况下的activity数据的存储和恢复和情况一是一模一样的。Activity优先级由高到低大概可以分为三种:1.前台activity,也就是正在和用户进行交互的activity 2.可见但非前台activity,比如说activity弹出了个对话框。3.后台activity,比如执行了额onStop的activity,优先级最低随时可能被回收。

如果不想activity重新创建,配置configchanges就行了:

Activity启动模式:

1.launchMode:

standard:标准模式,系统默认的模式,每创建一个activity都会创建一个新的实例。

singleTop:栈顶复用模式,如果新activity已经位于任务栈的栈顶便不会重新创建实例,而是会调用onNewIntent来获取请求信息,onCreate和onStart不会被调用。

singleTask:栈内复用模式,这是一种单实例模式,回调过程和singleTop一样。比如启动一个singleTask的activity A,首先会寻找是否存在A想要的任务栈,如果不存在则新创建一个任务栈并将A压入。如果存在任务栈,则会判断栈中是否有A的实例存在,有的话直接复用并且将该实例调到栈顶,如果不存在A的实例则创建一个并压入任务栈中。singleTask模式的activity切换到栈顶会导致它上面的栈内activity出栈。

singleInstance:单实例模式,这种模式的activity只能单独存在于一个任务栈中,后续的该activity都不会创建新的实例直到该任务栈被销毁。

2.Flags标记位

标记位的作用:1.部分标记位可以代替launchMode设置启动模式,比如FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_SINGLE_TOP 2.标记位还可以影响activity的运行状态,比如FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS。

FLAG_ACTIVITY_NEW_TASK:这个标记位是指定singleTask的启动模式

FLAG_ACTIVITY_SINGLE_TOP:这个标记位是指定singleTop的启动模式

FLAG_ACTIVITY_CLEAR_TOP:这个启动模式表示当此activity启动时,所有在栈内位于它上面的activity都要被弹出。它和singleTask模式配合使用的话,如果实例在任务栈中已经存在便会调到栈顶是,acitivty会调用onNewIntent方法。它和standard模式配合使用的话,它自己连同它之上的activity都要出栈,然后重新创建一个activity实例并压入栈顶。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:这个标记表示activity不会出现在activity历史列表中。

3.IntentFilter匹配规则

在隐式调用中只有cation,category,data完全匹配才算匹配成功,只有完全匹配才能成功启动目标activity。另外,隐式启动activity最好加上try catch,因为可能会匹配失败抛出异常。

action的匹配规则:intent中的action和过滤列表中的任何一个action相同即可匹配成功,并且intent中是必须有action的,不允许为空。

category的匹配规则:intent中的category和过滤列表中的任何一个category相同即可匹配成功,并且category可以为空,不加的时候系统会默认为intent添加android.intent.category.DEFAULT这个category。

data的匹配规则:如果过滤列表中添加了data,intent中也必须要添加匹配的data才行,仅仅匹配type也是可以运行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值