关键知识点:
Android开发、Activity生命周期、Activity启动模式(LaunchMode及Flags)、Activity的匹配规则(IntentFilter)
书归正传:
Activity生命周期
Activity作为Android开发的四大组件,使用的也是最频繁的一种组件,主要承担着界面展示的责任。对于Activity的生命周期我想大家都很熟悉了。下面我从2种情况去分析Activity生命周期,一种是典型的生命周期,另一种是当设备的Configuration发生改变的时候导致的Activity被销毁和重建。这2种情况下Activity生命周期是不同的。
(1)典型情况下Activity生命周期:
onCreate( ):Activity正在被创建,生命周期第一个方法,可以设置布局资源和初始化所需要的数据。
onRestart( ):Activity正在重新启动,主要是发生在当用户打开一个新Activity,此时会执行当前Activity的onPause()和onStop()方法,接着再回到当前这个Activity的时候会执行此方法,或者用户在当前Activity页面按下Home键,再回到这个Activity也会执行该方法。
onStart( ):Activity正在启动,此时Activity已经可见了,但是还不在前台,用户暂时无法与其交互。
onResume( ):Activity在已经可见,在前台,并且可以与其交互,与onStart( )的时候都是可见,但是onStart的时候Activity是在后台,onResume的时候才在前台。
onPause( ):Activity正在停止,正常会接着调用onStop()方法,但是如果Activity采用透明主题则不会调onStop()方法,注意,这个方法不能处理太耗时的操作,因为新打开的Activity是在此Activity执行完onPause之后才能执行onResume()。
onStop( ):Activity即将停止,可以做一些重量级的回收工作,不能太耗时。
onDestroy( ):Activity即将被销毁了,这是Activity生命周期的最后一个回调方法,可以执行最后的回收和资源释放工作。
当用户打开一个ActivityA的时候ActivityA回调方法执行顺序:onCreate()->onStart()->onResume();
打开新ActivityB的时候ActivityA回调方法执行:onPause()->onStop(),如果ActivityB采用透明主题,那么ActivityA不会执行onStop()方法;
用户再次回到ActivityA时回调:onRestart()->onStart()->onResume();
点击Back键的时候ActivityA回调:onPause()->onStop()->onDestroy();
思考:打开一个ActivityA,在ActivityA打开ActivityB,是先执行ActivityA的onPause()方法还是ActivityB的onResume()方法?
答案是先回调ActivityA的onPause()方法。
(2)异常情况下Activity生命周期:
当Activity没有指定Configuration的时候,在横竖屏切换的时候会导致Activity重新销毁并重新创建。此时Activity会回调onSaveInstanceState()方法,是在onStop()方法之前调用,参数Bundle可以保存数据。当重新打开时会调用onRestoreInstanceState()方法,调用时机实在onStart()方法之后,参数Bundle可以接受到onSaveInstanceState()保存的数据。这种情况下onCreate()的Bundle参数也可以获取到onSaveInstanceState()保存的数据。但是谷歌推荐使用onRestoreInstanceState()去恢复数据。
当资源内存不足的时候优先级比较低的Activity被杀死此时生命周期同上述情况一样
①前台Activity——正在和用户交互的Activity优先级最高
②可见但是非前台Activity——如Activity弹出的对话框,导致Activity可见但是位于后台无法与用户直接交互。
③后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低
针对第一种情况,我们如果不想重复走Activity生命周期的话可以设置Activity的android:configChages="oreentation | screenSize".
Activity启动模式
Activity的LaunchMode有四种:
①standard标准模式,系统默认模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
②singleTop栈顶复用模式,这种模式下如果新的Activity已经位于任务栈的栈顶就不会被重新创建,同时它的onNewIntent方法会被调用,intent参数可以取出数据信息。如果不是位于栈顶则会重新创建。
③singleTask栈内复用模式,单实例模式,只要activity存在启动的时候都会调用它并且回调onNewIntent方法,此模式具有clearTop效果,如果要打开的Activity在同一个任务栈不在栈顶,而在中间,则会清除它上面的所有任务,如果不是同一个任务栈则会创建任务栈并且Activity入栈。
④singleInstance单实例模式,这是一种加强的singleTop模式,具有此种模式的Activity只能单独存在于一个任务栈。
Activity的IntentFilter匹配规则
①action的匹配规则:intent中的action必须能够和过滤规则中的其中一个action匹配,action的字符串必须一致,区分大小写,一个过滤规则可以有多个action。
②catelog匹配规则:如果不指定catelog,系统会加上android.intent.category.DEAFAULT,如果intent加上了category,那么过滤规则中必须要有一个与之匹配。
③data的匹配规则:data由两部分组成,mimeType和URI,要求和action相似。如果没有指定URI,URI但默认值为content和file(schema)
结语:
个人学习笔记总结,有不正确的地方欢迎大家指出,先谢过了~