Activity相关知识介绍

Activity是什么?


Activity是用于与用户进行交互的界面组件,有自己的生命周期。界面组件除了Activity之外,还有Window、Dialog和Toast。

Activity的生命周期


一个Activity在进程中有不同的状态,如running/paused/stopped/killed。这里的生命周期,是指当Activity进入某种状态时会调用的一些函数。

当一个Activity被启动,执行OnCreate->OnStart->OnResume

当一个可交互状态的Activity被Dialog或一个窗口型Activity遮挡,执行OnPause

当一个可交互状态的Activity被完全遮挡,如启动了一个新Activity挡住当前Activity,则当前Activity执行OnPause->OnStop

当一个Activity被系统回收掉或者手动调用activity.finish();时,执行OnDestroy

onCreate:Activity被创建完成时调用
onStart:Activity已经开始运行时调用
onResume:Activity可以与用户交互时调用
OnPause:Activity无法与用户交互时调用
OnStop:Activity不可见时调用
OnDestroy:Activity被销毁前调用

Android中进程优先级


理解优先级之前需要理解进程的概念,进程的优先级可分为:前台进程->可见进程->服务进程->后台进程->空进程

前台进程:当前用户正在操作的Activity所属的进程
可见进程:当前用户还可以看到的Activity所属的进程
服务进程:Service所运行的进程
后台进程:不可见的Activty所属进程
空进程:什么都没有的进程,用于启动新进程时被重新使用。

老生常谈Activity启动模式


根据activity的不同应用场景,我们有时对启动一个Activity有一些特殊的要求……
使用示例:
Manifest.xml中
<activity 
    android:name=".MainActivity" android:launchMode="standard" />

standard:标准启动模式,该模式下启动一个Activity,每次都会生成一个新的实例置于Activity栈栈顶。

singleTop:栈复用模式,该模式下启动一个Activity,若此时Activity栈栈存在该Activity类的实例,则复用该实例。否则,生成一个新的实例置于Activity栈栈顶。

singleTask:栈复用模式,该模式下启动一个Activity,若此时Activity栈栈存在该Activity类的实例,则复用该实例,并将该实例在栈中之上的Activity全部弹出。否则,生成一个新的实例置于Activity栈栈顶。

singleInstance:单实例模式,该模式下的Activity独享一个Activity栈,且系统中所有进程共享该栈以及栈中Activity。

Activity启动Flags


Intent.FLAG_ACTIVITY_NEW_TASK (默认)
默认的跳转类型,根据AndroidManifest.xml中Activity的Affinity创建一个新的Activity,存放在Affinity对应的栈中。

FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于启动模式中的singletop。

FLAG_ACTIVITY_CLEAR_TOP
这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。(SingleTop启动模式实现了该Flags)

FLAG_ACTIVITY_NO_HISTORY
用这个FLAG启动的Activity不会被存放到栈中。

Activity数据保存


  • Activty处于onPause和onStop时随时可能被系统回收,但是Android提供了Activity两个回调方法:
    onSaveInstanceState()onRestoreInstanceState()
    onSaveInstanceState:默认会保存UI控件状态,如果需要保存一些变量的值,则需要覆写该方法(注意调用super.onSaveInstanceState(outState);outState是一个Bundle,可以用来存储可序列化的对象或基本类型(键值对))。
    onRestoreInstanceState:默认恢复UI控件状态,恢复变量值操作同上。
  • 由于onSaveInstanceState不一定能被调用(如手动调用activity.finish())所以若想做数据持久化(即数据永久保存)则可在onPause()中利用SharedPrefence、SQLite或文件来保存。

Activity的横竖屏切换


android:screenOrientation=”portrait
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation=”landscape“,为横屏显示。

关于切换时生命周期的变化,转载自横竖屏切换时候Activity的生命周期的总结中四楼的评论

刚启动
I/aaa: onCreate
I/aaa: onStart
I/aaa: onResume
切成横屏
I/aaa: onConfigurationChanged
I/aaa: onPause
I/aaa: onStop
I/aaa: onDestroy
I/aaa: onCreate
I/aaa: onStart
I/aaa: onRestoreInstanceState
I/aaa: onResume
切回竖屏
I/aaa: onConfigurationChanged
再切横,又是上面那一坨
再切竖,只有一个onConfigurationChanged

Android 23上的表现,with android:configChanges=”orientation” or android:configChanges=”orientation|keyboardHidden“

如果没有设android:configChanges,无论切横还是竖,都是切成横屏那一坨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值