记一次关于Activity跳转时生命周期变化的感悟

26 篇文章 0 订阅
26 篇文章 0 订阅

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()掉了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android开发中,Activity是应用程序的基本组件之一,它负责提供用户界面和用户交互。当用户执行不同的界面操作Activity生命周期会发生变化。以下是常见的几种用户界面操作和相应的Activity生命周期变化: 1. 启动Activity:当用户启动一个Activity,系统会按照以下顺序调用Activity生命周期方法: - onCreate():Activity被创建。 - onStart():Activity变得可见但无法与用户交互。 - onResume():Activity变得可见且可以与用户交互。 2. 关闭Activity:当用户关闭一个Activity,系统会按照以下顺序调用Activity生命周期方法: - onPause():Activity失去焦点,但仍然可见,用于保存快速恢复的状态。 - onStop():Activity不再可见,可以被系统回收。 - onDestroy():Activity被销毁。 3. 切换到后台:当用户切换到其他应用或按下Home键,当前Activity会进入后台,系统会按照以下顺序调用Activity生命周期方法: - onPause():Activity失去焦点,但仍然可见,用于保存快速恢复的状态。 - onStop():Activity不再可见,可以被系统回收。 4. 返回前台:当用户从后台返回应用,当前Activity会重新进入前台,系统会按照以下顺序调用Activity生命周期方法: - onRestart():Activity重新启动。 - onStart():Activity变得可见但无法与用户交互。 - onResume():Activity变得可见且可以与用户交互。 需要注意的是,Activity生命周期方法在不同情况下可能会被系统回调,但并不保证每个生命周期方法都会被调用。例如,当系统内存不足Activity可能会被销毁而不经过onStop()和onDestroy()方法。 以上是用户不同界面操作Activity生命周期的一般变化,具体情况还取决于应用程序的实现和开发者对生命周期方法的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值