Activity

Activity

Activity生命周期

activity

Activity状态

运行状态

当一个Activity位于返回栈的栈顶时,Activity就处于运行状态

暂停状态

当一个Activity不再处于栈顶位置,但仍然可见时,Activity就进入了暂停状态,比如对话框形式的Activity。只有在内存极低时,系统才会去考虑回收这种Activity

停止状态

当一个Activity不再处于栈顶状态,并且完全不可见时,就进入了停止状态。当其它地方需要时,处理停止状态的Activity有可能会被系统回收

销毁状态

一个Activity从返回栈中移除后就变成了销毁状态。系统倾向于回收处于这种状态的Activity,来保证手机内存充足

Activity被回收

当重新回到已经被回收的Activity时,此时会执行Activity的onCreate()方法。为了保存之前的临时数据和状态,需要重写onSaveInstanceState()方法(该方法保证在回收之前一定会调用),之后在onCreate中进行恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val tmp = "someting"
outState.putString("data_key", tmp)
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (savedInstanceState != null) {
val tmp = savedInstanceState.getString("data_key")

}
}

Activity消息传递

显示Intent

1
2
3
4
button.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}

隐式Intent

需要在AndroidManifest.xml中配置intent-filter

1
2
3
4
5
6
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
1
2
3
4
5
button.setOnClickListener {
val intent = Intent("com.example.activitytest.ACTION_START")
intent.addCategory("xxx")
startActivity(intent)
}
打开系统浏览器
1
2
3
4
5
button.setOnClickListener {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.baidu.com")
startActivity(intent)
}
向下一个Activity传递数据
1
2
3
4
5
6
button.setOnClickListener {
val data = "test"
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("extra_data", data)
startActivity(intent)
}
1
2
3
4
5
6
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val data = intent.getStringExtra("extra_data")
}
}

返回数据给上一个Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MainActivity : AppCompatActivity() {

private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
val intent = result.data
val returnData = intent?.getStringExtra("data_return")
Log.d("FirstActivity", "return data is $returnData")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
val button: Button = findViewById(R.id.button)
button.setOnClickListener{
val data = "Hello SecondActivity"
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("extra_data", data)
startForResult.launch(intent)
}
}
}

点击返回,回到上一个Activity时,也传递数据,需要在onBackPressedDispatcher中添加callback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class SecondActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
onBackPressedDispatcher.addCallback(object: OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
val intent = Intent()
intent.putExtra("data_return", "Hello FirstActivity")
setResult(RESULT_OK, intent)
finish()
}
}
}
}

Activity启动模式

standard

在standard模式下,每当启动一个新的Activity,就会在返回栈中入栈,并处于栈顶的位置。对于使用standard模式的Activity,系统不会在乎这个Activity是否已经在返回栈中存在,每次启动都会创建一个该Activity的新实例

singleTop

当Activity的启动模式设置为singleTop,在启动Activity时如果发现返回栈的栈顶已经是该Activity,则认为可以直接使用它,不会再创建新的Activity实例

1
2
3
4
<activity
android:name=".MainActivity"
android:launchMode="singleTop">
</activity>

singleTask

当Activity的启动模式设置为singleTask,在启动该Activity时,系统首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在则直接使用该实例,并把在这个Activity之上的所有其它Activity统统出栈;如果没有找到,则创建一个新的实例

singleInstance

当Activity的启动模式设置为singleInstance,在这种模式下,会有一个单独的栈来管理这个Activity,不论是哪个应用程序来访问这个Activity,都公用一个栈,来实现共享Activity实例


Activity
http://xrcol.github.io/2023/08/13/396dd2b36c92/
作者
XR
发布于
2023年8月13日
许可协议