Activity跳转时生命周期的变化:
Activity的生命周期:
01.onCreate() ->
02.onRestart() ->
03.onStart() ->
04.onResume() ->
05.onPause() ->
06.onStop() ->
07.onDestroy() -> 结束
08.onNewIntent() -> Activity的启动模式为singleTask,singleInstance或singleTop(此时已在任务栈顶端)时出现
- onCreate:当Activity创建实例完成,并调用attach方法赋值PhoneWindow、ContextImpl等属性之后,调用此方法。该方法在整个Activity生命周期内只会调用一次。调用该方法后Activity进入ON_CREATE状态。
- onStart:当Activity准备进入前台时会调用此方法。调用后Activity会进入ON_START状态。
- onResume:当Activity准备与用户交互的时候调用。调用之后Activity进入ON_RESUME状态。
- onPause:当前activity窗口失去焦点的时候,会调用此方法。调用后activity进入ON_PAUSE状态,并进入后台。
- onStop:当activity不可见的时候进行调用。调用后activity进入ON_STOP状态。
- onRestart :当从另一个activity切回到该activity的时候会调用。调用该方法后会立即调用onStart方法,之后activity进入ON_START状态。
- onDestroy:当activity被系统杀死或者调用finish方法之后,会回调该方法。调用该方法之后activity进入ON_DESTROY状态。
代码实例
01.创建页面1:
class MainActivity : AppCompatActivity(), MainContract.View{
private var i = 0
val handler = Handler()
private val mainPresenter = MainPresenter()
val runnable = object : Runnable {
override fun run() {
mainPresenter.count()
handler.postDelayed(this, 1000)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i("hy55", "MainActivity--------------->onCreate")
setContentView(R.layout.activity_main)
mainPresenter.takeView(this)
//立即执行
handler.postDelayed(runnable, 0)
findViewById<Button>(R.id.btn1).setOnClickListener {
startActivity(Intent(this, FirstActivity::class.java))
// finish()
// startActivityForResult(Intent(this, FirstActivity::class.java), 100)
}
findViewById<Button>(R.id.btn4).setOnClickListener {
// startActivity(Intent(this, FirstActivity::class.java))
// finish()
startActivityForResult(Intent(this, FirstActivity::class.java), 100)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
Log.i("hy55", "MainActivity--------------->onActivityResult")
}
override fun showMessage(i: Int) {
Toast.makeText(this, "该吃饭了+$i", Toast.LENGTH_SHORT).show()
Log.i("hy55", "Toast在显示")
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
//使用setIntent()获取最新的Intent数据
setIntent(intent)
Log.i("hy55", "MainActivity--------------->onNewIntent")
}
override fun onRestart() {
super.onRestart()
Log.i("hy55", "MainActivity--------------->onRestart")
}
override fun onStart() {
super.onStart()
Log.i("hy55", "MainActivity--------------->onStart")
}
override fun onResume() {
super.onResume()
Log.i("hy55", "MainActivity--------------->onResume")
}
override fun onPause() {
super.onPause()
Log.i("hy55", "MainActivity--------------->onPause")
}
override fun onStop() {
super.onStop()
// mainPresenter.dropView(this)
handler.removeCallbacksAndMessages(null)
//释放资源
Log.i("hy55", "MainActivity--------------->onStop")
}
override fun onDestroy() {
super.onDestroy()
mainPresenter.dropView(this)
handler.removeCallbacksAndMessages(null)
Log.i("hy55", "MainActivity--------------->onDestroy")
}
}
02.创建页面2:
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i("hy55", "FirstActivity--------------->onCreate")
setContentView(R.layout.activity_first)
findViewById<Button>(R.id.btn2).setOnClickListener {
//startActivity并没有自带finish()方法
startActivity(Intent(this, MainActivity::class.java))
// finish()
}
findViewById<Button>(R.id.btn3).setOnClickListener {
val intent = Intent()
intent.putExtra("gg", "String")
setResult(100, intent)
finish()
}
}
override fun onStart() {
super.onStart()
Log.i("hy55", "FirstActivity--------------->onStart")
}
override fun onPause() {
super.onPause()
Log.i("hy55", "FirstActivity--------------->onPause")
}
override fun onStop() {
super.onStop()
Log.i("hy55", "FirstActivity--------------->onStop")
}
override fun onRestart() {
super.onRestart()
Log.i("hy55", "FirstActivity--------------->onRestart")
}
override fun onResume() {
super.onResume()
Log.i("hy55", "FirstActivity--------------->onResume")
}
override fun onDestroy() {
super.onDestroy()
Log.i("hy55", "FirstActivity--------------->onDestroy")
}
override fun onBackPressed() {
//后退按钮是自带finish()方法的
super.onBackPressed()
}
}
03.定义Manifest.xml文件:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.StartActivityDemo">
<activity android:name=".MainActivity"
android:launchMode="singleInstance">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//
<activity android:name=".FirstActivity"
android:launchMode="singleTop"
android:theme="@style/MyTheme"/>
</application>
04.定义主题样式
<style name="MyTheme" parent="Theme.StartActivityDemo">
//页面半透明
<item name="android:windowIsTranslucent">true</item>
</style>
一、页面1 -> 页面2:
01.使用StartActivity()页面跳转
页面1:onPause()
页面2:onCreate() -> onStart() -> onResume()
页面1:onStop()
02.使用StartActivity()、finish()跳转
页面1:onPause()
页面2:onCreate() -> onStart() -> onResume()
页面1:onStop() -> onDestroy() //finish()方法会走到onDestroy()之中
03.使用onBackPressed()页面后退
页面2:onPause()
页面1:onRestart() -> onStart() -> onResume() || onCreate() -> onStart() -> onResume()
页面2:onStop() -> onDestroy() //后退按钮自带finish()
04.使用StartActivityForResult()跳转,使用setResult()、finish()后退
页面1:onPause()
页面2:onCreate() -> onStart() -> onResume()
页面1:onStop() //下面是后退
页面2:onPause()
页面1:onActivityResult() -> onRestart() -> onStart() -> onResume()
页面2:onStop() -> onDestroy()
注意:Activity处于返回栈栈顶,跳转的时候不会重新onCreate()">
05.使用StartActivity()跳转,使用StartActivity()后退
页面1:onPause()
页面2:onCreate() -> onStart() -> onResume()
页面1:onStop() //下面是后退
页面2:onPause()
页面1:onNewIntent() -> onRestart() -> onStart() -> onResume()
页面2:onStop()
注意:onNewIntent() 需要页面1的android:launchMode="singleInstance(singleTask)"
06.页面2的Theme:android:windowIsTranslucent=true
页面1:onPause()
页面2:onCreate() -> onStart() -> onResume()
页面1:onPause()
页面2:onNewIntent() -> onResume()
页面1:onStop()
注意:页面1跳转的时候没有走onStop(),后退的时候没有走onRestart()、onStart()">
二、启动模式:
- Standard 标准模式:每次跳转页面都是从onCreate()开始
- SingleTop 栈顶复用模式:页面处于栈顶就是从onRestart()开始
- SingleTask 栈内复用模式:页面处于栈内就是从onRestart()开始
- SingleInstance 单实例模式:一个页面一个栈永远是从onRestart()开始,除非页面被finish()掉了