关于onCreate(Bundle savedInstanceState, PersistableBundle persistentState)

  今天在我写demo的时候遇到一个问题,当我加载Activity界面的时候,打出onCreate随手回车,setContentView之后却始终无法显示界面,找遍一切可能出错的地方,最后在这个onCreate方法上面发现了猫腻。系统自动给我提供了这么一个onCreate()。

 @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
    }

  第一反应,我并不认识这是一个什么玩意。打开陈旧的api文档,也没有发现PersistableBundle这个类,于是只能求助百度,Google。原来是Api21新加的特性,上一下google,找一下最新api。我们先来看一下PersistableBundle是什么东西。

A mapping from String values to various types that can be saved to persistent and later restored.

  显然,这是一个和Bundle差不多的东西,Bundle我们就比较熟悉了。他两都是一个键值对,前者多了这么一段话,can be saved to persistent and later restored,可以持久化保存并且可以恢复。我们再看一下新的onCreate()方法的源码。

 /**
     * Same as {@link #onCreate(android.os.Bundle)} but called for those activities created with
     * the attribute {@link android.R.attr#persistableMode} set to
     * <code>persistAcrossReboots</code>.
     *
     * @param savedInstanceState if the activity is being re-initialized after
     *     previously being shut down then this Bundle contains the data it most
     *     recently supplied in {@link #onSaveInstanceState}.
     *     <b><i>Note: Otherwise it is null.</i></b>
     * @param persistentState if the activity is being re-initialized after
     *     previously being shut down or powered off then this Bundle contains the data it most
     *     recently supplied to outPersistentState in {@link #onSaveInstanceState}.
     *     <b><i>Note: Otherwise it is null.</i></b>

    public void onCreate(@Nullable Bundle savedInstanceState,
            @Nullable PersistableBundle persistentState) {
        onCreate(savedInstanceState);
    }

  从源码中可以看到,依然是调用了原始的onCreate()方法,结合以下两个方法,

 @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onRestoreInstanceState(savedInstanceState, persistentState);
    }

  最后记得在配置文件中注册当前Activity的时候加上这个属性,android:persistableMode="persistAcrossReboots",这样就可以给你的Activity存储一些持久化数据。当你的手机重启或者发生其他意外情况的时候,也可以给你的页面获取到相关数据。
  没有5.0的设备还没有验证过。。有没有试过的朋友说一下。。

有任何疑问,欢迎加群讨论:261386924

<think>嗯,用户想了解Android Activity生命周期中onCreate方法重写的作用和意义。我需要先回忆一下相关的知识。根据提供的引用资料,Activity的生命周期中有多个回调方法,比如onCreate、onStart、onResume等等。其中onCreate是第一个被调用的方法,用于初始化Activity。用户提到的重写onCreate,应该是指在自定义Activity时覆盖父类的onCreate方法,以执行必要的初始化操作。 首先,我要确认onCreate的作用。根据引用[3],onCreate是Activity生命周期的起点,系统在创建Activity实例时会自动调用这个方法。这时候用户还看不到这个Activity,所以这里适合做一些初始化工作,比如设置布局、绑定数据、初始化变量等。重写onCreate方法的主要目的就是让开发者有机会在这个阶段完成这些必要的设置。 然后,用户可能想知道为什么必须重写onCreate。比如,在引用[1]中提到,写Activity时通常是继承Activity类并重写相应的回调方法。这是因为默认的onCreate方法可能没有设置布局,所以如果不重写,界面就不会显示内容。比如在示例代码中,setContentView(R.layout.activity_main)就是在这里调用的,这样才能加载布局文件,显示界面元素。 接下来,关于onCreate的参数问题。引用[2]提到了两种onCreate方法的签名:一个是接受一个Bundle参数,另一个是两个参数的情况。这可能涉及到Activity的不同状态保存方式。单参数的onCreate是常用的,用于恢复被系统销毁前的状态,比如屏幕旋转后的数据恢复。而双参数的情况可能用于持久化状态的保存,但实际开发中可能较少使用。用户可能需要了解这两种情况的区别和应用场景,但根据问题,用户主要关注的是重写的意义,所以需要重点说明单参数的情况。 另外,引用[3]指出,onCreate到onDestroy是整个生命周期,而onCreate时用户还看不到Activity,直到onStart之后才可见。所以在onCreate中进行的初始化工作需要在用户可见前完成,确保界面和数据的正确加载。例如,初始化变量、加载布局、设置监听器等操作都应该在这里完成,避免影响用户体验。 可能用户还不太清楚如果不重写onCreate会有什么后果。比如,如果自定义的Activity没有重写onCreate,那么父类(通常是Activity)的onCreate会被调用,但默认情况下父类的onCreate可能不会设置任何布局,导致Activity显示空白,或者无法正确初始化必要的组件,应用可能无法正常运行。 总结来说,重写onCreate的作用包括:1. 执行必要的初始化操作;2. 加载布局和绑定UI组件;3. 恢复之前的状态(如果有);4. 为Activity的功能运行做准备。这些步骤对Activity的正常运行至关重要,因此重写onCreate是开发中的必要步骤。</think>### 一、`onCreate`方法的作用与意义 `onCreate`是Android Activity生命周期中第一个被系统调用的方法,其核心作用是**初始化Activity的关键组件和数据结构**,并在此时完成用户界面布局的加载。以下是其具体作用: 1. **初始化布局与组件** `onCreate`通过`setContentView(R.layout.xxx)`加载XML布局文件,将视图与Activity关联,例如: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 加载布局文件 Button btn = findViewById(R.id.button); // 绑定UI组件 } ``` 若不重写此方法,Activity将无法显示任何界面[^1]。 2. **恢复保存的状态** 当Activity因系统资源回收被销毁后重建时,系统会通过`Bundle savedInstanceState`参数传递之前保存的状态数据(如用户输入内容),开发者可在此恢复关键数据[^2]。 3. **初始化数据与逻辑** 在此阶段完成变量初始化、网络请求配置、数据库连接等操作,确保后续生命周期方法运行时数据已就绪。 --- ### 二、`onCreate`在生命周期中的定位 根据Activity生命周期模型: - **执行顺序**:`onCreate`是生命周期第一个回调,且**仅执行一次**(除非Activity被销毁后重建)[^3]。 - **可见性阶段**:`onCreate`执行时,Activity尚未对用户可见(用户看到的是前一个Activity),直到`onStart`调用后才会显示界面。 --- ### 三、单参数与双参数`onCreate`的区别 在引用[2]中提到的两种`onCreate`重载形式: 1. **单参数版本**(常用) ```java protected void onCreate(Bundle savedInstanceState) ``` 用于普通Activity初始化,`savedInstanceState`可恢复临时数据。 2. **双参数版本**(需`persistableMode`支持) ```java public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) ``` 适用于需要持久化状态(跨重启保留)的场景,需在`AndroidManifest.xml`中声明`android:persistableMode="persistAcrossReboots"`[^2]。 --- ### 四、实际开发中的注意事项 1. **必须调用`super.onCreate()`** 否则会抛出`SuperNotCalledException`异常。 2. **避免耗时操作** `onCreate`执行时间过长会导致界面启动延迟(ANR问题),建议将耗时任务异步处理。 ---
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值