1. Activity生命周期:
onCreate()--(创建)-->onStart()--(可见状态)-->onResume()--(可交互状态)-->onPause()-->onStop()-->onDestory()
onRestart():当Activity由不可见到可见(如回退、从桌面从新进入等)
2. Activity A启动Activity B的生命周期变化:
A.onResume()-->B.onCreate()-->B.onStart()-->B.onResume()-->A.onStop()
如果B是透明Activity则不执行A.onStop()
MainActivity跳转DownloadHelpActivity
DownloadHelpActivity启动透明的MainActivity
3. onSaveInstanceState()作用和调用时机
当内存不足或者旋转屏幕等非人为因素造成的Activity销毁,会使用onSaveInstanceState()进行数据保存。onSaveInstanceState()在onStop()之后调用,onRestoreInstanceState()在onStart()之后调用。
private val EXTRA_ET = "extra_et"
//数据保存
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString(EXTRA_ET, et.text?.toString() ?: "")
}
//数据恢复
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
val etContent = savedInstanceState.getString(EXTRA_ET) ?: ""
et.setText(etContent)
}
MainActivity横竖屏切换的生命周期
4. Activity4种启动模式,为什么需要启动模式
-
Standrard 标准模式(缺省):每次启动都会创建目标Activity实例,加入启动它的Activity所在的任务栈中。
-
SingleTop 栈顶复用模式:如果目标Activity已经在任务栈的栈顶,则不会创建新的实例,直接调用该Activity的onNewIntent()方法。
-
SingleTask 栈内复用模式:如果目标Activity已经在任务栈内,不会创建新的实例,直接将栈内该Activity之上的其他Activity出栈,调用该Activity的onNewIntent()方法。
-
SingleInstance 单例模式:目标Activity具有全局唯一性,独自占用一个任务栈。启动该Actvity时,如果该Activity已经存在,则直接调用其onNewIntent()方法。否则单独创建一个任务栈和目标Activity实例。该Activity启动的其他Activity都会运行在其他任务栈中。
一般会将应用程序中的MainActivity指定为SingleTask模式,避免重复创建实例,浪费内存。
<activity
android:name=".ui.activity.MainActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:launchMode="singleTask"
android:screenOrientation="portrait"/>
5. Activity常用Flags
-
FLAG_ACTIVITY_NEW_TASK:对应SingleTask模式,Application context 启动的Standard模式Activity需要添加该FLAG,因为该context没有默认的活动栈,无法正常启动Activity。
-
FLAG_ACTIVITY_SINGLE_TOP:对应SingleTop模式。
-
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:目标Activity不会出现在任务栈中。
-
FLAG_ACTIVITY_CLEAR_TOP:若目标Activity在栈中,启动时该Activity之上的其他Activity都要出栈。1、结合SingleTask模式,效果同SingleTask;2、结合Standard模式,不仅会将该Activity之上的其他Activity都出栈,目标Activity也会销毁重新创建实例。
-
FLAG_ACTIVITY_CLEAR_TASK:与FLAG_ACTIVITY_NEW_TASK一起使用,清除启动Activity所在任务栈的所有Activity,该栈作为目标Activity的栈。
6. Activity横竖屏切换生命周期变化:
横屏切竖屏与竖屏切横屏的生命周期变化是一样的:onPause-->onStop-->onDestory-->onCreate-->onStart-->onResume。
如果manifest中添加android:configChanges="orientation|screenSize|keyboardHidden"(忽略屏幕方向转换,忽略屏幕大小变化,忽略键盘),则不会发生上述生命周期变化,直接调用onConfigChanges()。
可添加android:screenOrientation="portrait"将屏幕方向固定为竖屏。
7. 如何启动其他应用Activity
通过隐式Intent启动其他应用Actvity(权限许可)
-
一个Activity可以有多组intent-filter,只要有一组匹配就可以启动该Activity;
-
只有同时匹配intent-filter中的action、category、data才算完全匹配,才能启动该Activity。
8. Activity、window、view之间的关系
Activity不直接管理页面,而是通过Window进行管理。每个Activity持有一个Window实例PhoneWindow,PhoneWindow持有一个DecorView。DecorView其实是一个FrameLayout,继承自View。Activity通过setContentView将xml布局添加到View中,显示到Window中。
9. Activity间通信(四大组件间通信)
-
跳转时将数据写入Intent/Bundle;
-
将数据存储在SharedPreference、数据库SQLite、外部存储、File文件;
-
通过广播或EventBus进行数据传递
-
通过类静态变量或全局Application
-
绑定Service
Activity与Fragment通信
-
通过Bundle,
fragment.setArguments(bundle),再将fragment添加到碎片栈中 -
接口