Android开发Android开发经验谈Android技术知识

关于Activity的一些难点

2019-04-13  本文已影响53人  大虾啊啊啊

1、前言

Activity作为Android四大组件中最重要的组件,在我们学习Android开发的时候,我们第一个组件就是学习它,Activity的具体含义就不介绍了,本文是介绍一些我们在开发中经常遇到,但是很容易忽略的点。

2、setResult()的调用时机

我们通过startActivityForResult从A跳转到B,在B中我们可以通过setResult方法设置返回值,在A中我们可以通过onActivityResult接受返回值。
但是setResult方法的调用时机是需要注意的。setResult的调用需要在B的finish方法之前。我们可以先看下执行流程:

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获取当前的请求数据。

上一篇 下一篇

猜你喜欢

热点阅读