Activity-的-36-大难点,你会几个?「建议收藏」_activity_36c3lcypcg8-程序员宅基地

技术标签: 程序员  经验分享  android  移动开发  

前言

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

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

文章目录


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OaIsxnq4-1623500717051)(//upload-images.jianshu.io/upload_images/16244318-c05596651a346d9e.png?imageMogr2/auto-orient/strip|imageView2/2/w/1172/format/webp)]

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


神图


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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aPP965cQ-1623500717054)(//upload-images.jianshu.io/upload_images/16244318-c38025440f80bd45.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

一、 生命周期


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

1.1 Dialog 弹出时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjZGsAaA-1623500717056)(//upload-images.jianshu.io/upload_images/16244318-f0db324232e2e892.png?imageMogr2/auto-orient/strip|imageView2/2/w/658/format/webp)]

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

1.2 横竖屏切换时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0n23ZRUx-1623500717058)(//upload-images.jianshu.io/upload_images/16244318-617ed81279008470.png?imageMogr2/auto-orient/strip|imageView2/2/w/1145/format/webp)]

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

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

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IQBLzYYE-1623500717060)(//upload-images.jianshu.io/upload_images/16244318-81211be143279d1c.png?imageMogr2/auto-orient/strip|imageView2/2/w/738/format/webp)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrYrI5h9-1623500717062)(//upload-images.jianshu.io/upload_images/16244318-13e69d3b360f61dd.png?imageMogr2/auto-orient/strip|imageView2/2/w/820/format/webp)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jdjdq6Og-1623500717063)(//upload-images.jianshu.io/upload_images/16244318-dab1c065ff797e2d.png?imageMogr2/auto-orient/strip|imageView2/2/w/688/format/webp)]

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

1.5 退出已调用多个 Activity 的 Application

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MfvTfvKw-1623500717064)(//upload-images.jianshu.io/upload_images/16244318-76880290ac2eceb7.png?imageMogr2/auto-orient/strip|imageView2/2/w/1113/format/webp)]

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TCwYuNjg-1623500717065)(//upload-images.jianshu.io/upload_images/16244318-cf84e36e8300ce00?imageMogr2/auto-orient/strip|imageView2/2/w/767/format/webp)]

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

1.7 修改 Activity 进入和退出动画

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2OK1CWfC-1623500717066)(//upload-images.jianshu.io/upload_images/16244318-ddce04028a9d2f7a.png?imageMogr2/auto-orient/strip|imageView2/2/w/1072/format/webp)]

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

1.8 Activity 的四种状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yXBc8nop-1623500717067)(//upload-images.jianshu.io/upload_images/16244318-2c137889038ab97d.png?imageMogr2/auto-orient/strip|imageView2/2/w/864/format/webp)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYJ9ojLP-1623500717068)(//upload-images.jianshu.io/upload_images/16244318-23816af0b1eca4ac.png?imageMogr2/auto-orient/strip|imageView2/2/w/525/format/webp)]

  • stopped :这个 activity 被另外一个 activity 完全覆盖,但是这个 activity 的所有状态信息和成员变量仍然存在(除了内存紧张)
  • killed :这个 activity 已经被销毁,其所有的状态信息和成员变量已经不存在了。

1.9 如何处理异常退出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-exwctSsq-1623500717068)(//upload-images.jianshu.io/upload_images/16244318-754e8e8718f544de.png?imageMogr2/auto-orient/strip|imageView2/2/w/1096/format/webp)]

  • Activity 异常退出的时候 --> onPaus
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_56712078/article/details/117855199

智能推荐

大数据案例--电信日志分析系统_电信用户日志分析有什么字段-程序员宅基地

文章浏览阅读3.1k次。目录一、项目概述1、概述二、字段解释分析1、数据字段2、应用大类3、应用小类三、项目架构四、数据收集清洗1、数据收集2、数据清洗五、Sqoop使用1、简介2、Sqoop安装步骤3、Sqoop的基本命令六、数据导出七、数据可视化1、概述2、步骤八、扩展1、各个网站的表现能力2、小区HTTP上网能力3、小区上网喜好4、查询语句一、项目概述1、概述①、当用户通过网络设备(手机、平板电脑、笔记本电脑等)._电信用户日志分析有什么字段

Mybatis plus @TableField作用_mybatis tablefield注解报错-程序员宅基地

文章浏览阅读6.9k次。@TableField(exist = false) 注解加载bean属性上,表示当前属性不是数据库的字段,但在项目中必须使用,这样在使用bean的时候,mybatis-plus就会忽略这个,不会报错..._mybatis tablefield注解报错

获取JSON字符串中键的个数_json数组 key的数量-程序员宅基地

文章浏览阅读2.1k次。JSON字符串(格式需要和下面一样):user:{"names":"admin","birthday":"2019-12-2","email":"[email protected]","nickName":"Vince-ZZ"} let count = Object.keys(user).length console.log(count); //打印出:4..._json数组 key的数量

COSCon'19 开源硬件论坛:源生态 造起来!-程序员宅基地

文章浏览阅读1.4k次。点击上方“开源社”关注我们| 作者:梁尧|编辑:Corrie发轫2018年,基于促进软硬融合、共享大开源生态的初心,在业界同仁的大力支持下,COSCon 首场开源硬件..._开源硬件社区

linux一直telnet,系统运维-程序员宅基地

文章浏览阅读1.2k次。Telnet,是系统管理员登录远程服务器的一种协议和工具。然而,由于所有的通信都没有加密,包括密码,都是明文发送的。Telnet 在 SSH 被开发出来之后就基本弃用了。登录远程服务器,你可能不会也从未考虑过它。但这并不意味着 telnet 命令在调试远程连接问题时不是一个实用的工具。本教程中,我们将探索使用 telnet 解决所有常见问题:“我怎么又连不上啦?”这种讨厌的问题通常会在安装了像 W..._长telnet

vlc播放流程分析--1_vlc cannot read /data/vlc/vlc/lib/vlc/plugins/plug-程序员宅基地

文章浏览阅读3.8k次。本文基于windows下的vlc。1、 cpu性能检测: 该功能在加载libvlccore.dll时由系统调用该动态库的DllMain()(/src/win32/thread.c,该函数再调用vlc_CPU_Init())执行的,即发生在WinMain()函数执行之前,加载vlc.exe的依赖库时。通过dumpbin工具查看vlc.exe,可知vlc.exe依赖于libvlc.dll_vlc cannot read /data/vlc/vlc/lib/vlc/plugins/plugins.dat

随便推点

windows服务器运行ffmpeg报错,mfplat.dll模块已加载但找不到入口点dllregisterserver_ffmpeg.dll已加载,但找不到入口点-程序员宅基地

文章浏览阅读5.5k次。windows服务器运行ffmpeg报错-mfplat.dll模块已加载但找不到入口点dllregisterserver1首先找到对应的mfplat.dll版本。我的是将别人win7+64位系统的mfplat.dll即目录在C:\Windows\SysWOW64\拷贝到win7对应的C:\Windows\SysWOW64\目录下。注意:拷贝到电脑的C:\Windows\SysWOW64\而不是 C:\Windows\System32\。2在C:\Windows\System32\目录下找到cm_ffmpeg.dll已加载,但找不到入口点

centos与kylinV10 FTP搭建与用户创建_麒麟ftp服务增加用户-程序员宅基地

文章浏览阅读1k次。centos,麒麟系统kylin,配置ftp用户并在过程中遇到的问题以及解决方式_麒麟ftp服务增加用户

Android 资料库_android资料库-程序员宅基地

文章浏览阅读146次。一、Android 程序员需要掌握的技术栈:数据结构算法、程序架构、设计模式、性能优化、插件化、热更新、Kotlin、NDK、Jetpack,以及常用的开源框架源码分析如 Flutter、Router、RxJava、Glide、LeakCanary、Dagger2、Retrofit、OkHttp、ButterKnife 等:https://github.com/chiclaim/Android..._android资料库

十个最佳Java编程技巧,越早知道越好-程序员宅基地

文章浏览阅读168次。初识Java语言,觉得Java满足了我上学时候对编程语言的所有要求。Java语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了。高级语言,如果做不到这样,还扯啥高级呢?1. 把字符串常量放在前面通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个..._java编程小技巧

Java中的Thread类_java thread-程序员宅基地

文章浏览阅读9.9k次,点赞14次,收藏55次。线程_java thread

sap LICENSE KEY和 ACCESS KEY 破解_sap license-程序员宅基地

文章浏览阅读1.6w次。sap LICENSE KEY和 ACCESS KEY 破解_sap license

推荐文章

热门文章

相关标签