前言
- 学
Android
有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关Activity
的内容以问题的形式梳理出来,也供大家查缺补漏。
本文中,我将一改往日写博客的习惯,全文用 XMind 将所有知识点以思维导图的形式呈现,欢迎大家食用~~
文章目录
方便大家学习,我在 GitHub 上建立个 仓库
-
仓库内容与博客同步更新。由于我在
稀土掘金
简书
CSDN
博客园
等站点,都有新内容发布。所以大家可以直接关注该仓库,以免错过精彩内容!
神图
- 在开始之前,先让我们看看
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()
方法就行。
- 发送特定广播:
- 在需要结束应用时, 发送一个特定的广播,每个
Activity
收到广播后,关闭 即可。 - 给某个
activity
注册接受接受广播的意图registerReceiver(receiver, filter)
- 如果过接受到的是 关闭
activity
的广播activity finish()
掉
- 递归退出
- 就调用
finish()
方法 把当前的Activity
退出 - 在打开新的
Activity
时使用startActivityForResult
, 然后自己加标志, 在onActivityResult
中处理, 递归关闭。
- 其实
- 也可以通过
intent
的flag
来实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
激活一个新的activity
。 - 此时如果该任务栈中已经有该
Activity
, 那么系统会把这个Activity
上面的所有Activity
干掉。 - 其实相当于给
Activity
配置的启动模式为singleTask
。
- 记录打开的
Activity
- 每打开一个
Activity
, 就记录下来。 - 在需要退出时 , 关闭每一个
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