1.oncreate(),onstart,onresume(),onpouse(),onstop(),ondistory(),如果您有一个生命周期感知型组件与您的 Activity 生命周期相关联,该组件将收到相应的 ON_CREATE
,ON_START
事件。系统将调用带有 @OnLifecycleEvent 注释的方法,以使您的生命周期感知型组件可以执行已创建状态所需的任何设置代码。
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun initializeCamera() {
if (camera == null) {
getCamera()
}
}
2.一般都在oncreate内初始化控件,因为这个回调函数只会调用一次
3.如果系统因限制(例如配置变更或者是内存压力)而导致activity被销毁,虽然实际的activity实例会消失,但是如果用户尝试退回到该activity时,系统会用一组描述activity销毁时状态的已保存数据新建该activity,这些已保存数据是存储在bundle对象中的键值对集合。(如edittext中输入的文本值),但是如果activity想要恢复更多的数据时,bundle可能就不适用了,因为bundle对象并不适合保存大量数据,因为它需要在主线程上进行序列化处理并占用系统进程内存。因此如果需要保存大量数据,应该使用持久性本地存储,onSaveInstanceState()方法和Viewmodle类来保存数据
4.当activity开始停止时,系统会调用onSaveInstanceState()方法,以便可以将activity的状态信息保存到实例bundle中,此方法会默认实现以保存activity视图层次结构状态的瞬时信息,例如EditText微件中的文本或listview微件的滚动位置,但是如果需要保存其他信息,则需要替换onSaveInstanceState()方法,并将键值对添加到意外销毁时的activity中所保存的bundle对象中,如果想默认实现保存视图层次结构的状态,必须调用父类实现
override fun onSaveInstanceState(outState: Bundle?) {
// Save the user's current game state
outState?.run {
putInt(STATE_SCORE, currentScore)
putInt(STATE_LEVEL, currentLevel)
}
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(outState)
}
companion object {
val STATE_SCORE = "playerScore"
val STATE_LEVEL = "playerLevel"
}
5.当系统显示关闭activity时,或者在其他情况下调用finish()时,系统不会调用onSaveInstanceState()
6.如果需要保持持久性数据,应该在activity位于前台是抓住适合机会,如果没有机会,应该执行在onStop()方法期间保存此类数据
7.可以选择实现在onStart()方法之后调用的onRestoreInstanceState(),而不是在oncreate()期间恢复状态,仅当系统存在要恢复的已保存状态时,系统才会调用onRestoreInstanceState(),因此无需检查bundle是否为null.
8.Intent对象可以指定需要启动的具体的activity,或者描述需要执行的操作类型(系统将自动选择相应的activity,该activity甚至可能来自不同应用)。Intent对象还可以携带少量的数据
val intent = Intent(this, SignInActivity::class.java)
startActivity(intent)
或者
val intent = Intent(Intent.ACTION_SEND).apply {
putExtra(Intent.EXTRA_EMAIL, recipientArray)
}
startActivity(intent)
9.如果新启动的Activity不需要返回结果,则可以选择调用startActivity()方法来启动
10.如果需要在activity结束时从activity中获取返回结果。例如,需要启动一项activity,让用户在联系人列表中选择收件人;当activity结束时,系统将返回用户选择的收件人,为此,可以选择调用startActivityForResult(Intent,int)方法,结果将通过onActivityResult(int,int,Intent)方法返回,它可以调用 setResult(int)将数据返回到父级Activity,此外,子级Activity可以返回一个包含数据的Intent对象,如果子级Activity由于任何原因(例如崩溃)而失败,父级Activity将收到代码为RESUT_CANCELED的结果
class MyActivity : Activity() {
// ...
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// When the user center presses, let them pick a contact.
startActivityForResult(
Intent(Intent.ACTION_PICK,Uri.parse("content://contacts")),
PICK_CONTACT_REQUEST)
return true
}
return false
}
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
when (requestCode) {
PICK_CONTACT_REQUEST ->
if (resultCode == RESULT_OK) {
startActivity(Intent(Intent.ACTION_VIEW, intent?.data))
}
}
}
companion object {
internal val PICK_CONTACT_REQUEST = 0
}
}
11.当一个activity启动另一个activity时,他们都会经历生命周期轮换。第一个activity停止运行并进入“已暂停”或“已停止”状态,同时创建另一个Activity。生命周期回调的顺序已有明确的定义,特别是当两个activity在同一进程(应用)中,以下是activityA启动activityB的操作发生顺序
activityA的onpause()方法执行
activityB中的oncreate()、onstart()、onresume()方法会依次得到执行(activityB现在具有用户焦点)
然后,如果activityA在屏幕上不再显示,其onstop()方法会得到执行