Android组件之Activity

2019-07-21  本文已影响0人  xulj100

1、什么是Activity
Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满屏幕也可以小于屏幕并浮动在其他窗口之上。

2、Activity的创建与启动
创建Java类继承Activity,然后在AndroidManifest.xml里面进行注册,Activity销毁调用finish()方法。
Activity的启动分为显式启动与隐式启动,看代码:

override fun onClick(v: View) {
        when (v.id) {
            R.id.btn_goto_fun1 -> {
                //显式启动
                startActivity(Intent(this, ActivitySecond::class.java))
            }
            R.id.btn_goto_fun2 -> {
                /**
                   隐式启动
                   <activity android:name="com.hy.android.blog.ActivitySecond"
                      android:configChanges="orientation" >
                      <intent-filter>
                       <action android:name="second_action"/>
                       <category android:name="second_category"/>
                       <category android:name="android.intent.category.DEFAULT"/>
                      </intent-filter>
                    </activity>
                 */
                val intent=Intent()
                intent.action = "second_action"
                intent.addCategory("second_category")
                startActivity(intent)
            }
            R.id.btn_goto_fun3 -> {

                /**
                    requestCode 100 请求码区分是谁发送的,必须大于0

                     this@ActivitySecond.setResult(101,Intent().putExtra("send_first","hello"))
                     this@ActivitySecond.finish()
                     resultCode 101 第二个页面销毁时返回的响应码
                 */
                startActivityForResult(Intent(this, ActivitySecond::class.java),100)
            }
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        Log.e(tag, "requestCode==$requestCode >>> resultCode==$resultCode")
        Log.e(tag,"data=="+data!!.getStringExtra("send_first"))
        //ActivityFirst: requestCode==100 >>> resultCode==101
        //ActivityFirst: data==hello
    }

3、Activity的生命周期

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_first)
        Log.e(tag, "----onCreate---------正在创建。")
        initView()
    }

    override fun onStart() {
        super.onStart()
        Log.e(tag, "----onStart----------正在启动,Activity可见但不在前台,无法和用户交互。")
    }

    override fun onResume() {
        super.onResume()
        Log.e(tag, "----onResume---------获得焦点,Activity可见且在前台并开始活动。")
    }

    override fun onPause() {
        super.onPause()
        Log.e(tag, "----onPause----------正在停止,旧Activity的onPause会先执行,才会启动新的Activity。")
    }

    override fun onStop() {
        super.onStop()
        Log.e(tag, "----onStop----------即将停止,新Activity是透明主题时,旧Activity都不会走onStop。")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.e(tag, "----onDestroy---------即将销毁,回收工作、资源释放。")
    }

    override fun onRestart() {
        super.onRestart()
        Log.e(tag, "----onRestart---------重新启动,由不可见到可见。")
    }
    override fun onSaveInstanceState(outState: Bundle?) {
        super.onSaveInstanceState(outState)
        Log.e(tag, "----onSaveInstanceState--非用户主动去销毁,保存状态")
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
        super.onRestoreInstanceState(savedInstanceState)
        Log.e(tag, "----onRestoreInstanceState--数据恢复")
    }

    override fun onConfigurationChanged(newConfig: Configuration?) {
        super.onConfigurationChanged(newConfig)
        Log.e(tag, "----onConfigurationChanged----"+newConfig!!.orientation)
    }

Activity的切换过程:由ActivityFirst跳转到ActivitySecond,如下:

ActivityFirst: ----onCreate---------正在创建。
ActivityFirst: ----onStart----------正在启动,Activity可见但不在前台,无法和用户交互。
ActivityFirst: ----onResume---------获得焦点,Activity可见且在前台并开始活动。
ActivityFirst: ----onPause----------正在停止,旧Activity的onPause会先执行,才会启动新的Activity。
ActivitySecond: ---onCreate---------正在创建。
ActivitySecond: ---onStart-----------正在启动,Activity可见但不在前台,无法和用户交互。
ActivitySecond: ---onResume---------获得焦点,Activity可见且在前台并开始活动。
ActivityFirst: ----onStop----------即将停止,新Activity是透明主题时,旧Activity都不会走onStop。

这时如果ActivitySecond销毁再次回到ActivityFirst,如下:

ActivitySecond: ---onPause---------正在停止,旧Activity的onPause会先执行,才会启动新的Activity。
ActivityFirst: ----onRestart---------重新启动,由不可见到可见。
ActivityFirst: ----onStart----------正在启动,Activity可见但不在前台,无法和用户交互。
ActivityFirst: ----onResume---------获得焦点,Activity可见且在前台并开始活动。
ActivitySecond: ---onStop---------即将停止,新Activity是透明主题时,旧Activity都不会走onStop。
ActivitySecond: ---onDestroy---------即将销毁,回收工作、资源释放。

ActivityFirst已经启动时,关闭屏幕/按Home键:

ActivityFirst: ----onPause----------正在停止
ActivityFirst: ----onStop----------即将停止

再次回到ActivityFirst时:

ActivityFirst: ----onRestart---------重新启动
ActivityFirst: ----onStart-----------正在启动
ActivityFirst: ----onResume----------获得焦点

ActivityFirst已经启动,切换横屏,再次切回竖屏时:

ActivityFirst: ----onPause----------正在停止
ActivityFirst: ----onSaveInstanceState
ActivityFirst: ----onStop-----------即将停止
ActivityFirst: ----onDestroy--------即将销毁
ActivityFirst: ----onCreate---------正在创建
ActivityFirst: ----onStart----------正在启动
ActivityFirst: ----onRestoreInstanceState
ActivityFirst: ----onResume---------获得焦点
ActivityFirst: ----onPause----------正在停止
ActivityFirst: ----onSaveInstanceState
ActivityFirst: ----onStop-----------即将停止
ActivityFirst: ----onDestroy--------即将销毁
ActivityFirst: ----onCreate---------正在创建
ActivityFirst: ----onStart----------正在启动
ActivityFirst: ----onRestoreInstanceState
ActivityFirst: ----onResume---------获得焦点

当设置android:configChanges="orientation|screenSize"时,再次切换横、竖屏:

ActivityFirst: ----onConfigurationChanged----2
ActivityFirst: ----onConfigurationChanged----1

3、Activity四种启动模式

上一篇下一篇

猜你喜欢

热点阅读