Activity 的 36 大难点,你会几个?「建议收藏」

本文详述了Android中Activity的生命周期、启动模式、数据传递、Context理解和进程管理等36个关键难点,包括Dialog弹出时生命周期、横竖屏切换、Activity状态、启动模式的应用、数据保存、Intent传递限制、onNewIntent执行时机等。通过实例和场景分析,帮助开发者巩固和提升对Activity的掌握。
摘要由CSDN通过智能技术生成

前言

  • 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Activity 的内容以问题的形式梳理出来,也供大家查缺补漏。

本文中,我将一改往日写博客的习惯,全文用 XMind 将所有知识点以思维导图的形式呈现,欢迎大家食用~~

文章目录


方便大家学习,我在 GitHub 上建立个 仓库


神图


  • 在开始之前,先让我们看看 Android 的 activity 到底都有哪些东西?
  • 借一张网上很火的图带你了解 Activity

一、 生命周期


  • 我们生命周期先看看具体有哪些方法回调,在逐一攻破:

1.1 Dialog 弹出时

  • 如果是单纯是创建的 dialog ,Activity 并不会执行生命周期的方法
  • 但是如果是跳转到一个不是全屏的 Activity 的话, 当然就是按照正常的生命周期来执行了
  • 即 onPasue() -> onPause() ( 不会执行原 Activity 的 onStop() , 否则上个页面就不显示了 )

1.2 横竖屏切换时

  • 不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

  • 设置 Activity 的 android:configChanges="orientation" 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

  • 设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

  • 注意:还有一点,非常重要,一个 Android 的变更细节!当 API >12 时,需要加入 screenSize 属性,否则屏幕切换时即使你设置了 orientation 系统也会重建 Activity !

  • 横竖屏切换生命周期的执行

1.3 不同场景下 Activity 生命周期的变化过程

image

  • 启动 Activity : onCreate() ---> onStart() ---> onResume() ,Activity 进入运行状态。
  • 锁屏时会执行 onPause() 和 onStop() , 而开屏时则应该执行 onStart() onResume()

  • Activity 退居后台: 当前 Activity 转到新的 Activity 界面或按 Home 键回到主屏: onPause() ---> onStop() ,进入停滞状态。
  • Activity 返回前台: onRestart() ---> onStart() ---> onResume() ,再次回到运行状态。
  • Activity 退居后台: 且系统内存不足, 系统会杀死这个后台状态的 Activity ,若再次回到这个 Activity ,则会走 onCreate() --> onStart() ---> onResume()

1.4 将一个 Activity 设置成窗口的样式

只需要给我们的 Activity 配置如下属性即可。
android:theme="@android:style/Theme.Dialog"

1.5 退出已调用多个 Activity 的 Application

  • 通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish() 方法就行。

  • 发送特定广播:
  1. 在需要结束应用时, 发送一个特定的广播,每个 Activity 收到广播后,关闭 即可。
  2. 给某个 activity 注册接受接受广播的意图 registerReceiver(receiver, filter)
  3. 如果过接受到的是 关闭 activity 的广播 activity finish() 掉
  • 递归退出
  1. 就调用 finish() 方法 把当前的 Activity 退出
  2. 在打开新的 Activity 时使用 startActivityForResult , 然后自己加标志, 在 onActivityResult中处理, 递归关闭。
  • 其实
  1. 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 激活一个新的 activity
  2. 此时如果该任务栈中已经有该 Activity , 那么系统会把这个 Activity 上面的所有 Activity干掉。
  3. 其实相当于给 Activity 配置的启动模式为 singleTask 。
  • 记录打开的 Activity
  1. 每打开一个 Activity , 就记录下来。
  2. 在需要退出时 , 关闭每一个 Activity

1.6 锁定屏与解锁屏幕,Activity 如何执行生命周期

  • 锁屏时会执行 onPause() 和 onStop() , 而开屏时则应该执行 onStart() onResume()

1.7 修改 Activity 进入和退出动画

  • 可以通过两种方式 , 一是通过定义 Activity 的主题 ,二是通过覆写 Activity 的 overridePendingTransition 方法。
  • 通过设置主题样式在 styles.xml 中编辑代码 , 添加 themes.xml 文件:在 AndroidManifest.xml 中给指定的 Activity 指定 theme
  • 覆写 overridePendingTransition 方法:overridePendingTransition(R.anim.fade, R.anim.hold);

1.8 Activity 的四种状态

  • runnig :用户可以点击,activity 处于栈顶状态。
  • paused :activity 失去焦点的时候,被一个非全屏的 activity 占据或者被一个透明的 activity 覆盖,这个状态的 activity 并没有销毁,它所有的状态信息和成员变量仍然存在,只是不能够被点击。(内存紧张的情况,这个 a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值