原文地址 :http://blog.csdn.net/u014315849/article/details/50902784
一 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设置一个属性:
然后我们的Activity就拥有了持久化的能力了,一般我们会搭配另外两个方法来使用:
相信有些朋友对这两个方法名不陌生吧,前一个方法会在下述情形中被调用:
- 点击home键回到主页或长按后选择运行其他程序
- 按下电源键关闭屏幕
- 启动新的Activity
- 横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建 重要原则:当系统"未经你许可"时销毁了你的activity,则onSaveInstanceState会被系统调用, 这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。
而后一个方法,和onCreate同样可以从取出前者保存的数据: 一般是在onStart()和onResume()之间执行! 之所以有两个可以获取到保存数据的方法,是为了避免Act跳转而没有关闭, 然后不走onCreate()方法,而你又想取出保存数据~