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四种启动模式
- 标准模式(默认模式): android:launchMode="standard"
每次启动一个Activity就会创建一个新的实例。 - 栈顶复用模式:android:launchMode="singleTop"
果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调onNewIntent()方法。 - 栈内复用模式:android:launchMode="singleTask"
只要该Activity在一个任务栈中存在,都不会重新创建,并回调onNewIntent()方法 - 单实例模式: android:launchMode="singleInstance"
具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例。