onSaveInstanceState 的数据存在哪里

首页 / 常见问题 / 低代码开发 / onSaveInstanceState 的数据存在哪里
作者:低代码开发工具 发布时间:10-25 13:58 浏览量:1918
logo
织信企业级低代码开发平台
提供表单、流程、仪表盘、API等功能,非IT用户可通过设计表单来收集数据,设计流程来进行业务协作,使用仪表盘来进行数据分析与展示,IT用户可通过API集成第三方系统平台数据。
免费试用

对于 Activity 的 onSaveInstanceState 方法大家都不会陌生,当 Activity 在不正常销毁的情况下,就会调用 onSaveInstanceState 方法,并将 Activity 中需要保存的数据(比如 View 状态 或者我们自己的数据)保存到这个方法的参数 Bundle 中。

一、onSaveInstanceState 的数据

对于 Activity 的 onSaveInstanceState 方法大家都不会陌生,当 Activity 在不正常销毁的情况下,就会调用 onSaveInstanceState 方法,并将 Activity 中需要保存的数据(比如 View 状态 或者我们自己的数据)保存到这个方法的参数 Bundle 中。

但是在实际使用的时候你可能会发现当保存的数据过大的时候就会看到如下的 log 日志

javabinder !!! FAILED BINDER TRANSACTION !!!

甚至可能发生异常(在高版本下会抛出异常,低版本直接打印日志)

android.os.TransactionTooLargeException

上面的信息都是表示 Bundle 传输的数据过大,那么问题来了, onSaveInstanceState 中 Bundle 的数据是存放在哪里,为什么又限制?

Binder 传输缓冲区是一个限制的大小的区域,大小为 1MB,这块缓冲区用于所有进程间的通信,也就是 Binder 通信。这些传输包括 onSaveInstanceState , startActivity 和其他与系统的交互,当传输的数据超过这个大小的时候就会抛出异常。

特别是 onSaveInstanceState 方法,因其需要在 Activity 返回的时候提供数据,官网建议是数据大小不大于 50K。

在追 onSaveInstanceState 的方法源码的时候,想要找到关于 Binder 方面的内容,就顺着Activity 的方法追,很多人都是到 Application 的 接口中就迷路了.

public interface ActivityLifecycleCallbacks {

        void onActivityCreated(Activity activity, Bundle savedInstanceState);

        void onActivityStarted(Activity activity);

        void onActivityResumed(Activity activity);

        void onActivityPaused(Activity activity);

        void onActivityS较好ped(Activity activity);

        void onActivitySaveInstanceState(Activity activity, Bundle outState);

        void onActivityDestroyed(Activity activity);

    }

其实这是一个错误的方向,其实只要想到 onSaveInstanceState 有点类似于 Activity 中其他生命周期的方法,就可以发现 onSaveInstanceState 最开始也是有 ActivityThread 做统一管理的,那么 onSaveInstanceState 的调用 也就和 ActivityThread 有关。

Bundle 的创建

在 ActivityThread 的源码中可以看到有这么个方法

private void callCallActivityOnSaveInstanceState(ActivityClientRecord r) {

        r.state = new Bundle();

        r.state.setAllowFds(false);

        if (r.isPersistable()) {

            r.persistentState = new PersistableBundle();

            mInstrumentation.callActivityOnSaveInstanceState(r.activity, r.state,

                    r.persistentState);

        } else {

            mInstrumentation.callActivityOnSaveInstanceState(r.activity, r.state);

        }

    }

其中最后调用了 mInstrumentation.callActivityOnSaveInstanceState 那么就到 mInstrumentation 类中查找

public void callActivityOnSaveInstanceState(Activity activity, Bundle outState,

            PersistableBundle outPersistentState) {

        activity.performSaveInstanceState(outState, outPersistentState);

    }

这个方法中又调用了 activity.performSaveInstanceState 的方法

final void performSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {

        onSaveInstanceState(outState, outPersistentState);

        saveManagedDialogs(outState);

        storeHasCurrentPermissionRequest(outState);

        if (DEBUG_LIFECYCLE) Slog.v(TAG, “onSaveInstanceState ” + this + “: ” + outState +

                “, ” + outPersistentState);

    }

    …

      public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {

        onSaveInstanceState(outState);

    }

最后调用的是 Activity onSaveInstanceState 方法 ,显然 callCallActivityOnSaveInstanceState 的 r.state 就是 onSaveInstanceState 的方法的中的参数 Bundle .而 r 就是 ActivityThread 的内部类 ActivityClientRecord

static final class ActivityClientRecord {

        IBinder token;

        int ident;

        Intent intent;

        String referrer;

        IVoiceInteractor voiceInteractor;

        Bundle state; // 这个就是 r.state 也就是 onSaveInstanceState 的 Bundle

}

延伸阅读:

二、什么是Activity的生命周期

简单来说,Activity的生命周期是指一个Activity从其从创建到销毁的过程中会处于不同的状态,每个状态也有其对应的回调方法,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该 Activity 所在的进程。

最后建议,企业在引入信息化系统初期,切记要合理有效地运用好工具,这样一来不仅可以让公司业务高效地运行,还能最大程度保证团队目标的达成。同时还能大幅缩短系统开发和部署的时间成本。特别是有特定需求功能需要定制化的企业,可以采用我们公司自研的企业级低代码平台织信Informat。 织信平台基于数据模型优先的设计理念,提供大量标准化的组件,内置AI助手、组件设计器、自动化(图形化编程)、脚本、工作流引擎(BPMN2.0)、自定义API、表单设计器、权限、仪表盘等功能,能帮助企业构建高度复杂核心的数字化系统。如ERP、MES、CRM、PLM、SCM、WMS、项目管理、流程管理等多个应用场景,全面助力企业落地国产化/信息化/数字化转型战略目标。 版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们微信:Informat_5 处理,核实后本网站将在24小时内删除。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系邮箱:hopper@cornerstone365.cn 处理,核实后本网站将在24小时内删除。

最近更新

开发公司团队架构表怎么写
11-17 13:54
网站开发公司怎么找
11-17 13:54
如何选择软件定制开发公司
11-17 13:54
如何开发公司的团队优势
11-17 13:54
在Timing这款App的开发公司—武汉氪细胞 工作是什么体验
11-17 13:54
网站开发公司名称怎么起名
11-17 13:54
怎么选择专业网站开发公司
11-17 13:54
app开发公司怎么选择
11-17 13:54
如何开发公司团队
11-17 13:54

立即开启你的数字化管理

用心为每一位用户提供专业的数字化解决方案及业务咨询

  • 深圳市基石协作科技有限公司
  • 地址:深圳市南山区科技中一路大族激光科技中心909室
  • 座机:400-185-5850
  • 手机:137-1379-6908
  • 邮箱:sales@cornerstone365.cn
  • 微信公众号二维码

© copyright 2019-2024. 织信INFORMAT 深圳市基石协作科技有限公司 版权所有 | 粤ICP备15078182号

前往Gitee仓库
微信公众号二维码
咨询织信数字化顾问获取最新资料
数字化咨询热线
400-185-5850
申请预约演示
立即与行业专家交流