IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android:onActivityCreated和onCreate到底那一个先调用呢?一 记曾看到刀尖舔血的代码 -> 正文阅读

[移动开发]Android:onActivityCreated和onCreate到底那一个先调用呢?一 记曾看到刀尖舔血的代码

总所周知,Application可以注册一个activity的生命周期回调。如下:
application.registerActivityLifecycleCallbacks(object:ActivityLifecycleCallbacks{
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                TODO("Not yet implemented")
            }

            override fun onActivityStarted(activity: Activity) {
                TODO("Not yet implemented")
            }

            override fun onActivityResumed(activity: Activity) {
                TODO("Not yet implemented")
            }

            override fun onActivityPaused(activity: Activity) {
                TODO("Not yet implemented")
            }

            override fun onActivityStopped(activity: Activity) {
                TODO("Not yet implemented")
            }

            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
                TODO("Not yet implemented")
            }

            override fun onActivityDestroyed(activity: Activity) {
                TODO("Not yet implemented")
            }

        })
那onActivityCreated和activity的onCreate到底哪一个先执行呢? 说出这个问题,大家会不会觉得我傻了,肯定是onCreate先执行了,我也是这么想的。可是今天看到一段代码却惊呆了我,代码大致如下:
	protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(AppManager.getInstance().isAppKilled()) {
                //重启app操作
            }
    }
public class AppManager {
//启动app默认设置为true
private boolean isKilled = true
//其他的方法省略
}
 application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
                activityList.add(activity);
                if (如果是启动的activity) {
                    setAppIsKilled(false)//设置为false之后 AppManager.getInstance().isAppKilled()获取的就是false
                }
            }
上面的代码一看是不是就感觉,这个app在无限重启,因为isKilled 默认为true 且一定会先调用onCreate方法 所以就会无限重启了。 但是事实确实,app正常打开。我去!!!为啥,难道是我记错了?当时真的有点错愕,所以直接看了源码,那么onActivityCreated是何时调用的呢? 我们看一下Activity onCreate的源码
 protected void onCreate(@Nullable Bundle savedInstanceState) {
        //省略。。。
        getApplication().dispatchActivityCreated(this, savedInstanceState);
        //省略。。。
    }
这里面有这么一段话,getApplication().dispatchActivityCreated(this, savedInstanceState);获取了Application,并且调用了dispatchActivityCreated。好见证奇迹的时刻到了,看看dispatchActivityCreated做了什么吧
/* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
显而易见,分发了注册进去的生命周期回调,那我们这个场景简单来说,调用了onActivityCreated。 那我们回过头看看为什么那一端代码可以执行吧,因为在onCreate先调用了super,所以一路super最终在activity里面进行了注册的事件分发,调用了onActivityCreated。在onActivityCreated执行完毕之后才调用了onCreate super之后的代码 即执行力重启之前的判断。

😥

这么一分析,其实就很明了了,虽然方法是onCreate先被调用执行,但是写在onCreate在调用super之后的代码却执行在了onActivityCreated之后🙄。但凡手抖一下调用顺序错位一下,app就启动不了了。所以我称这个代码写的真的是刀尖舔血😂。不知道当时写代码的人是真的了解了,还是凑巧😅

🤦?♀?

总结一下:onCreate方法先与onActivityCreated调用。执行顺序:onCreate方法里super之前的代码先执行,其次执行onActivityCreated的代码,最后执行onCreate方法里super之后的代码。虽然比较简单,但是感觉还是蛮重要的😂。
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:57:05  更:2021-08-06 09:57:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 13:52:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码