关于Activity的一些难点
1、前言
Activity作为Android四大组件中最重要的组件,在我们学习Android开发的时候,我们第一个组件就是学习它,Activity的具体含义就不介绍了,本文是介绍一些我们在开发中经常遇到,但是很容易忽略的点。
2、setResult()的调用时机
我们通过startActivityForResult从A跳转到B,在B中我们可以通过setResult方法设置返回值,在A中我们可以通过onActivityResult接受返回值。
但是setResult方法的调用时机是需要注意的。setResult的调用需要在B的finish方法之前。我们可以先看下执行流程:
- B---setResult
- B---onPause
- A---onActivityResult
- A---onRestart
- A---onStart
- A---onResume
- B---onStop
- B---onDestroy
当我们在B的onPause方法中,活之后执行setResult方法,那么在A中是无法接受到值的,因此必须在B的onPause之前。也就是在B的finish之前setResult方法。
3、关于onSaveInstanceState和onRestoreInstanceState
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
关于这两个方法我们做简单的介绍,不细究。
当系统的配置变化,或者资源不足等等一些外界因素导致Activity被消耗并且重建,比如屏幕的旋转。那么onSaveInstanceState方法会被调用,保存一些临时的数据在Bundle中,比如View的一些值等等,但是这个数据大小是有限制的。当Activity被重建的时候会调用onRestoreInstanceState方法以及onCreate方法,把数据传递到Bundle savedInstanceState这个参数。我们可以获取到一些之前保存的数据。这样可以做到一定的数据保存和恢复。但是我们提到,onSaveInstanceState方法保存的数据大小是有限制的,并且是经过序列话的数据。我们在恢复的时候通过反序列化恢复。所以这两个方法还是有很大限制的,解决方案,我们可以使用Android Jatpack组件的ViewModel作为解决方案。之前的文章已经提到,本文就不介绍了。有兴趣的同学可以去看看。
4、onConfigurationChanged方法
我们以上提到,当设备的配置信息改变会导致Activity被销毁重建,而设置在AndroidManifest中配置android:configChanges则避免Activity销毁重建,系统会回调onConfigurationChanged方法。
举个例子,假如我们配置了 android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"
orientation表示屏幕方向的变化
screenSize表示屏幕尺寸的变化
假如我们配置了这两个参数,这样当在Activity屏幕旋转的时候,不会导致Activity被销毁和重建,而是会调用了onConfigurationChanged,提示我们系统配置发生了变化。
5、onNewIntent方法
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
onNewIntent方法不是每次Activity的启动都会被创建的,只有当Activity的启动模式为singleTask(栈内复用)、singleInstance(单实例)、singleTop(栈顶复用)这三种启动模式中的一种的时候,假如Activity已经被启动,存在栈中,再次启动A的时候,就会调用A的onNewIntent方法(特别注意的是,如果启动模式是singleTop的时候,必须保证A在栈顶的情况下,onNewIntent方法才会被调用)。onNewIntent方法可以通过Intent获取当前的请求数据。