Activity的onCreate方法一直是我们编写一个activity最先重载的方法。细心的小伙伴在编写代码的时候回看到这样一幕:

咦,这里怎么会有两个onCreate提供给我们重载?选择困难症患者表示根本选不出来。WTF?长久的经验告诉我们,我们要重载的是第一个onCreate方法,他只有一个参数也一直只有一个参数。并且用protected进行约束。

**两个方法有什么区别?

我们知道onCreate 是Activity生命周期的第一个方法。我们通常会在onCreate中做一些View初始化,等等操作。onCreate在整个生命周期只会初始化一次外,他还有一个很重要的作用:当我们的Activity非正常销毁之后,

例如手机旋转,内存不足导致的后台自动销销毁。为了保护我们的数据可以将数据保存在savedInstanceState中,当Activity重启数据依旧不会消失。我们可以通过onCreate方法中的savedInstance参数拿到我们的数据。

做法很简单只要重载onSaveInstanceState或者onRestoreInstance就可以了:


@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}

将数据以键值对的形式传入,方法提供一个Bundle类型的outState参数暂存数据。之后再onCreate中取出,保证Activity销毁但是数据不销毁。真是简单实用的功能解决了大多数手机内存不足而用户前台数据丢失的痛点。

onCreate方法以及足够强大,但是他能否更加强大?有没有这样一种情况,手机由于过热,没电或者第三方定制Rom由于卡顿而异常关机的情况?当用户在操作前台数据的时候手机突然关机了,怎么办?下面介绍onCreate的第二个方法

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

没错,当你的手机异常关机,他能帮你找回之前前台的数据。他实际上是一种数据持久化的Activity。哇塞,真牛逼。那么我们应该怎么样使用呢?

首先,我们需要在Android 的清单文件的Activity中指定如下属性:

android:persistableMode="persistAcrossReboots"

接着重载onSaveInstanceState或者onRestoreInstance:

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

他们对应着一个PersistableBundle类型的persistentState。对齐进行操作就OK了。

补充:上面说到重载onSaveInstanceState或者onRestoreInstance。这里解释一下这两个方法onSaveInstanceState调用时机是当前Activity即将被销毁而还未被销毁的时候。而当系统调用了onRestoreInstance就表示这个Activity已经被销毁了。这个可以看需求

进行调用,这里补充一下知识点。

两个onCreate方法?你真的了解onCreate()么?的更多相关文章

  1. android开发之onCreate( )方法详解

    这里我们只关注一句话:This is where you should do all of your normal static set up.其中我们只关注normal static,normal: ...

  2. Android——onCreate( )方法详解(转)

    android开发之onCreate( )方法详解 onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Go ...

  3. Activity竟然有两个onCreate方法,可别用错了

    public class HomeDetailActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceSt ...

  4. 如何在onCreate方法中获取视图的宽度和高度

    你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当 ...

  5. Android app启动activity并调用onCreate()方法时都默默地干了什么?

    Android app启动activity并调用onCreate() 方法时都默默地干了什么?   在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...

  6. HackThirteen 在onCreate()方法中获取View的宽度和高度

    1.概要:     Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出:     如果开发一些依赖于UI控件的宽和高的功 ...

  7. android activity在横竖屏切换的时候不重新调用onCreate方法

    在安卓系统中,横竖屏切换会默认重新调用onCreate等生命周期方法,如果此时有一些临时数据没有保存下来,很有可能会导致该数据丢失. 因此我们可以进行以下设置,来避免恒切换时重新调用onCreate方 ...

  8. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

  9. Android onConfigurationChanged用法(规避横竖屏切换导致的重新调用onCreate方法)

    onConfigurationChanged的目的是为了规避横竖屏切换干掉activity而重新调用onCreate方法的问题:有的时候,我们希望重新进入OnCreate生命周期,此时可以调用onSa ...

随机推荐

  1. 知识点查缺补漏贴01-进程间通讯之mmap文件共享

    引文: 个人名言:“同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人”.经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进程间通讯之mmap. 一.概念 ...

  2. Vcenter 和ESXi License过期解决办法

    Vcenter License过期解决办法 用client连接vcenter:  KEY必须用vCenter Server 5 Standard序列号如果使用使用的“vCenter Server 5 ...

  3. CA单向认证和双向认证的区别?

    1:单向认证,内容会被串改吗?

  4. 补充2:Golang 一些特性

    Go语言的这些地方都做的还不错: 拥有自动垃圾回收: 不用手动释放内存 一个包系统: Go 语言的源码复用建立在包(package)基础之上.包通过 package, import, GOPATH 操 ...

  5. CRM 2016 级联过滤 类比省市县

    以下以省市为例: function preFilterLookup() { //要进行过滤的lookup按钮加入addPresearch事件 Xrm.Page.getControl("shi ...

  6. OpenGL 多线程共享纹理

    1:opengl 多线程共享纹理纹理: //解码时候使用opengl进行绘制,需要构建队列和两个线程,分别用于解码数据并且填充纹理和渲染. 主线程常见两个共享上下文: main() { ⋯⋯⋯⋯ gH ...

  7. 管理11gRAC基本命令 (转载)

    在 Oracle Clusterware 11g 第 2 版 (11.2) 中,有许多子程序和命令已不再使用:    crs_stat    crs_register    crs_unregiste ...

  8. Oracle 存储过程 延迟执行 DBMS_LOCK.SLEEP(60);

      --测试代码: declare -- Local variables here i integer; begin -- Test statements here dbms_output.put_l ...

  9. uva140-暴力枚举

    题意:任意一个点都至少有一个点与其相连接,所有的点可以进行任意排列,总排列数为n!. 一个点带宽定义与它相连的点的最远距离,一个排列的带宽定义为,点中最大的带宽,找出带宽最小的那个排列,有多组,输出字 ...

  10. 隐藏bat脚本运行时弹出的黑窗口,以隐藏进程在后台执行.

    1.把这段代码写在前面@echo offif "%1"=="r" goto startif "%1"=="h" goto ...