这是我参与「第四届青训营 」笔记创作活动的的第1天
前言
通过这次的青训营活动,能够让我对之前学习的Android知识进行系统的复习,加深对Android基础的理解,并且通过笔记的形式记录下来。
四大基础组件
一、Activity
1.1Activity的生命周期
首先是一张经典的图片
Activity从启动到结束会以如下顺序经历整个生命周期:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
Activity生命周期回调方法具体如下:
onCreate():创建时会带哦,一般在此处创建视图和绑定数据
onStart():已启动,即将进入前台
onResume():以用户开始交互,位于Activity栈顶
onPause():Activity失去焦点或已暂停,Activity界面部分可见,下一个生命周期是onResume()或onStop()
onStop():Activity不在可见,下一个回调的是onRestart()或onDestory()
onRestart():重启已停止的Activity,下一个回调的是onStart()
onDestory():销毁Activity,释放该Activity所有资源
onSaveInstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据
onRestoreInstanceState()/onCreate():用于恢复数据, onRestoreInstanceState回调则表明其中Bundle对象非空,不用加非空判断。onCreate需要非空判断
生命周期的几种普通情况
- 针对一个特定的Activity,第一次启动,回调如下:onCreate()->onStart()- >onResume()
- 用户打开新的Activiy的时候,上述Activity的回调如下:onPause()->onStop()
- 再次回到原Activity时,回调如下:onRestart()->onStart()->onResume()
- 按back键回退时,回调如下:onPause()->onStop()->onDestory()
- 按Home键切换到桌面后又回到该Actitivy,回调如下:onPause()->onStop()- >onRestart()->onStart()->onResume()
1.2特殊情况下的生命周期
横竖屏切换
在横竖屏切换的过程中,会发生Activity被销毁并重建的过程。
横竖屏切换的生命周期:onPause()->onSaveInstanceState()-> onStop()- >onDestroy()->onCreate()->onStart()->onRestoreInstanceState->onResume()
可以通过在AndroidManifest文件的Activity中指定如下属性来避免横竖屏切换时,Activity的销毁和重建:
android:configChanges = "orientation| screenSize"
同时回调了下面的方法:
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
1.3Activity的启动模式
Activity四种启动模式
-
标准模式(standard)
- 每启动一次Activity,就会创建一个新的Activity实例并置于栈顶。
- 应用场景:绝大多数Activity,例如浏览器
-
栈顶复用模式(singleTop)
-
如果需要新建的Activity位于任务栈栈顶,那么此Activity的实例就不会重建,而是重 用栈顶的实例。(不允许Activity连续重复)并回调如下方法:
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); } -
应用场景: 在通知栏点击收到的通知,然后需要启动一个Activity,这个Activity就 可以用singleTop
-
-
栈内复用模式(singleTask)
-
该模式是一种单例模式,即一个栈内只有一个该Activity实例
-
该模式,可以通过在 AndroidManifest文件的Activity中指定该Activity需要加载到那个栈中,即singleTask 的Activity可以指定想要加载的目标栈。singleTask和taskAffinity配合使用,指定开 启的Activity加入到哪个栈中。(不允许栈内Activity重复)
<activity android:name=".MyActivity" android:launchMode="singleTask" android:taskAffinity="com.qxy.noerror" android:label="@string/app_name"> </activity> -
应用场景: 大多数App的主页。
-
-
单例模式(singleInstance)
-
全局复用,系统全局不允许Activity重复
-
应用场景: 呼叫来电界面。。
设定Activity的启动模式的Flags
- FLAG_ACTIVITY_NEW_TASK 其效果与指定Activity为singleTask模式一致。
- FLAG_ACTIVITY_SINGLE_TOP 其效果与指定Activity为singleTop模式一致。
- FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity,当它启动时,在同一 个任务栈中所有位于它上面的Activity都要出栈。