终于来到了activity,作为平时看到最多的一个东西,里面有太多东西值得我探索了。
基本用法
新建一个Activity
1.在android studio中新建一个activity
2.在AndroidManiFest.xml文件中添加对应Activity
3.如果Activity是作为主Activity,则需要在AndroidManiFest.xml中配置
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
Activity之间跳转
打开另外一个Activity
普通方式
val intent = Intent(this, MainTestActivity::class.java)
startActivity(intent)
向下一个Activity传递数据
val intent = Intent(this, MainTestActivity::class.java)
intent.putExtra("data", 1)
startActivity(intent)
返回数据给上一个Activity
在启动的Activity调用startActivityForResult,requestCode保证是一个唯一值。
[在新版android studio中发现已经标为了废弃,谷歌推荐使用registerForActivityResult]
val intent = Intent(this, MainTestActivity::class.java)
val requestCode = 100
startActivityForResult(intent, requestCode)
在被启动的Activity中
val intent = Intent()
intent.putExtra("data", "hello")
setResult(RESULT_OK, intent)
finish()
在上一个Activity中
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (resultCode) {
mRequestCode -> if (resultCode == RESULT_OK) {
val returnData = data?.getStringExtra("data")
}
}
}
使用隐式Intent
所谓隐式就是表示不明确指出启动哪一个Activity,而是指出了action和cateagory信息。然后交由系统分析这个Intent,并找到合适的Activity去启动
在AndroidManiFest.xml 中Activity中加入
<intent-filter>
<action android:name="com.example.activity.ANION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
启动Activity
val intent = Intent("com.example.activity.ANION_START")
startActivity(intent)
当然也可以自己定义,然后调用intent.addCategory()
来实现
<category android:name="android.intent.category.MY_CATEGORY" />
生命周期
onCreate
创建activity的时候调用
onStart
由不可见变为可见的时候调用
onResume
准备好和用户交互的时候调用
onPause
准备启动另外一个应用activitiy的时候调用
onStop
变为完全不可见的时候调用
onDestory
销毁的时候调用。一般是调用finish()之后会调用
onRestart
重新启动的时候会被调用
启动模式
standard
如果没有特别指定,默认的启动方式就是standard
singleTop
在启动Activity时,如果发现当前栈顶已经是该Activity,则认为可以直接使用它,不再创建新的Activity。
android:launchMode="singleTop"
singleTask
每次在启动Activity时,会先检测当前返回栈中是否存在该Activity,如果存在,则直接使用,并将此Activity之上的Activity全部出栈。如果没有发现,新建一个
android:launchMode="singleTask"
singleInstance
指定为singleInstance的Activity会创建一个单独的返回栈来管理Activity。这么做的意义是为了如果多个应用打开一个同Activity,不同的应用会有不同的返回栈。相当于创建了两个Activity
android:launchMode="singleInstance"