Activity
创建一个layout
页面布局
在AndroidManifest
文件中注册
Activity 页面跳转
每个Activity
有两个标签 action
和category
action
指定活动触发动作
category
指定活动的分类 将category
元素声明为 DEFAULT
可使 Activity 能够接收启动请求
显式intent
,intent
可以理解为 -> 用户想要的操作 ,根据不同的intent来调用不同的Activity
展现给用户
val button1:Button = findViewById(R.id.button1) //获取布局文件中的控件的实例
button1.setOnClickListener { //设置点击事件
Toast.makeText(this,"显式intent",Toast.LENGTH_LONG).show()
val intent=Intent(this,SecondActivity::class.java) //显式直接指定某个Activity展现
startActivity(intent)
}
//现在更倾向于使用BindingView来获取布局中的控件, 解决findViewById()的频繁使用
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button1.setOnClickListener {
//设置点击事件
}
隐式intent
, 隐式和显式的区别:显式直接指定某个Activity展现,而隐式根据intent
包含的action
和category
自动寻找合适的Activity
跳转的Activity
的category
一定要有DEFUALT
否则不能启动
val button4:Button = findViewById(R.id.button4) //获取布局文件中的控件的实例
button4.setOnClickListener {
Toast.makeText(this,"隐式intent",Toast.LENGTH_LONG).show()
val intent=Intent("com.example.activitytest.ACTION_STRAT")
//根据intent包含的 action 和 category 自动寻找合适的Activity
intent.addCategory("android.intent.category.MY_CATEGORY")
startActivity(intent)
}
使用intent
打开网页的 Activity
val button_3:Button = findViewById(R.id.button3)
button_3.setOnClickListener {
val intent=Intent(Intent.ACTION_VIEW)
intent.data=Uri.parse("https://baidu.com") //统一资源标识符,解析
startActivity(intent)
}
Activity的生命周期
返回栈
Activity
的启动与销毁是一个栈的结构
Activity状态
- 运行态:当一个
Activity
处于栈顶时就是运行态 - 暂停状态:当一个
Activity
不在栈顶,但是仍然可见的情况下就是暂停状态,比如有对话框的Activity
,这种情况的Activity
是完全活着的,因为用户是看得见这个Activity
的。 - 停止状态:
Activity
不处于栈顶,而且完全不可见,系统会为这个Activity
保存相应的状态和成员变量,但这不是完全可靠的,当其他地方需要内存的时候系统可能会回收 - 销毁状态:
Activity
从返回栈中移除,Activity
回收
Activity的生存期
7个回调方法
onCreate()
:每一个Activity都要重写这个方法,初始化操作,加载布局、绑定事件
onStart()
:有不可见变为可见的时候调用
onResume()
:准备和用户进行交互的时候调用、这个时候一定位于栈顶、并且处于运行态
onPause()
:在系统准备启动或恢复另一个Activity的时候调用(暂停状态)
onStop()
:在完全不可见的时候调用(停止状态)
onDestroy()
:在被销毁前调用(销毁状态)
onRestart()
:在由停止态变为运行态之前调用,也就是Activity被重新启动了
完整生存期
在onCreate()
与onDestroy()
之间所经历的就是完整生存期
可见生存期
在onStart()
与onStop()
之间所经历的就是可见生存期
前台生存期
在onRestart()
与onPause()
之间所经历的就是前台生存期
Activity在停止态时被回收,产生的临时数据消失怎么办?
onSaveInstanceState()
回调方法可以保证在Activity回收之前一定被调用
如使用putString方法保存字符串,putInt方法保存整数,第一个参数是键,第二个参数是值
//重写onSaveInstanceState方法
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tempData = "something you typed"
outState.putString("data_key",tempData)
}
//onCreate时获取键为data_key的值
val tempeData = savedInstanceState.getString("data_key")
Activity的启动模式
在实际项目中要以特定的需求使用恰当的启动模式
4种启动模式
Standard
:默认启动模式,系统不会在意该Activity是否在栈中存在,每次启动都会创建一个新的Activity
singleTop
:当系统发现当前栈顶与正要启动的Activity是一样的,则可认为直接使用它而不创建新的Activity
,,如果当前栈顶不是要启动的Activity
,系统还是会重新创建一个Activity
singleTask
:系统检测返回栈看是否已经存在Activity
,如果有则直接使用,并且把这个Activity
之上的所有Activity
出栈。这样保证了在整个应用中只存在一个该Activity
实例
singleInstance
:最复杂的启动模式,字面上理解为单一实例。它具备所有singleTask
的特点,唯一不同的是,它是存在于另一个任务栈中。