Android四大组件-Activity | 青训营笔记

113 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第1天

前言

通过这次的青训营活动,能够让我对之前学习的Android知识进行系统的复习,加深对Android基础的理解,并且通过笔记的形式记录下来。

四大基础组件

一、Activity

1.1Activity的生命周期

首先是一张经典的图片

image-20220802215203675.png

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

  1. FLAG_ACTIVITY_NEW_TASK 其效果与指定Activity为singleTask模式一致。
  2. FLAG_ACTIVITY_SINGLE_TOP 其效果与指定Activity为singleTop模式一致。
  3. FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity,当它启动时,在同一 个任务栈中所有位于它上面的Activity都要出栈。