bug修复-android中的onCreate两个参数的方法是什么鬼?

一 bug阐述和解决


今天,在开发中遇到了这样一个问题:

就是没有界面显示。明明有setContentView xml文件在可视化开发环境下也正常显示.,原来是复写onCreate函数时出现了问题

在安卓5.0版本之前onCreate函数默认为

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_main);
}

在安卓5.0版本提供了一个带PersistableBundle参数的onCreate函数

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

  自己将setContentView 放在了上面的第二个方法中,从而导致了界面不显示。出现空白界面。其实它也是调用了oncreate一个参数的方法,但是我们如果在这里面进行setContentView,也就相当于在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>
 *
 * @see #onCreate(android.os.Bundle)
 * @see #onStart
 * @see #onSaveInstanceState
 * @see #onRestoreInstanceState
 * @see #onPostCreate
 */
public void onCreate(@Nullable Bundle savedInstanceState,
        @Nullable PersistableBundle persistentState) {
    onCreate(savedInstanceState);
}

二 问题延伸

那么这第二个参数到底用来干嘛的呢。于是看到了上面的方法描述:

* 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>.
这个方法和调用onCreate一个参数的方法一样的,只是被那些已经创建过并且将persistableMode设置为persistAcrossReboots的activtiy调用。那么已经创建过的activity是什么意思呢?比如我们“最近用过”屏幕

2.1 关于“最近用过”

在以前的版本中,对于用户最近与之互动的每个应用,“最近用过”屏幕都 只能显示一个任务。现在,您的应用可以视需要针对其他并行活动或文档打开多个任务。通过此功能,用户可以在“最近用过”屏幕中快速切换各个活动和文档,并 能在所有应用之间获得一致的切换体验,从而实现多任务处理。此类并行任务示例可能包括:网络浏览器应用中打开的标签页、效率类应用中的文档、游戏中的并行 对局或信息应用中的聊天。您的应用可以通过 ActivityManager.AppTask 类管理任务。

要插入逻辑中断,以便系统能够将您的活动视为一个新任务,请在通过 startActivity() 启动活动时使用FLAG_ACTIVITY_NEW_DOCUMENT。您还可以在清单中将 <activity> 元素的 documentLaunchMode 属性设置为 "intoExisting" 或"always",从而实现该行为。

为了避免“最近用过”屏幕过于混乱,您可以设置应用能够在该屏幕中显示的任务数上限。为此,请设置 <application> 的android:maxRecents 属性。目前可以指定的上限为,每个用户 50 个任务(对于 RAM 较小的设备,则为每个用户 25 个任务)。

您可以将“最近用过”屏幕中的任务设置为在重新启动过程中保持不变。要控制这一持续行为,请使用android:persistableMode 属性。您也可以通过调用 setTaskDescription() 方法,来更改“最近用过”屏幕中活动的视觉属性,如活动的颜色、标签和图标。

2.2 关于persistableMode

属性链接地址:persistableMode


这就是5.0给我们提供的新的方法,要用它,先要在配置文件中为我们的Activity设置一个属性:

android:persistableMode="persistAcrossReboots"

然后我们的Activity就拥有了持久化的能力了,一般我们会搭配另外两个方法来使用:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)

相信有些朋友对这两个方法名不陌生吧,前一个方法会在下述情形中被调用:

  1. 点击home键回到主页或长按后选择运行其他程序
  2. 按下电源键关闭屏幕
  3. 启动新的Activity
  4. 横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建 重要原则:当系统"未经你许可"时销毁了你的activity,则onSaveInstanceState会被系统调用, 这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。

而后一个方法,和onCreate同样可以从取出前者保存的数据: 一般是在onStart()和onResume()之间执行! 之所以有两个可以获取到保存数据的方法,是为了避免Act跳转而没有关闭, 然后不走onCreate()方法,而你又想取出保存数据~


  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值