【android】源码解析——onSaveInstanceState执行时机

本文深入探讨了Android中onSaveInstanceState方法的调用时机,特别是在不同targetSdkVersion下的执行位置。该方法在非人为销毁Activity时,如用户按下home键、手机息屏、启动新Activity或横竖屏切换时被调用。根据源码分析,从Android 11到28,onSaveInstanceState的执行分别位于onPause前、onStop前和onStop后。
摘要由CSDN通过智能技术生成

之前对于activity的onSaveInstanceState方法的调用时机一直不是很理解,看到一些文章讲过onSaveInstanceState以下5种情况被调用:

  1. 当用户按下手机home键的时候。
  2. 长按手机home键或者按下菜单键时。
  3. 手机息屏时。
  4. FirstActivity启动SecondActivity,FirstActivity就会调用,也就是说打开新Activity时,原Activity就会调用。
  5. 默认情况下横竖屏切换时。

本文从源码的角度深入理解下改方法的执行时机。

众所周知,Android通过ActivityThread执行回调activity各个生命周期方法onPause/onStop等等。

通过分析ActivityThread的源码,得到在非人为销毁activity情况下(非按下返回键和调用finish方法情况下)onSaveInstanceState执行。
具体执行时机为:

  • targetSdkVersion <(android 11)onPause前执行,
  • targetSdkVersion >=(android 11)targetSdkVersion <(android 28) onStop前执行,
  • targetSdkVersion >= android 28 onStop后执行。

接下来通过源码具体分析下

handlePauseActivity
    @Override
    public void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving,
            int configChanges, PendingTransactionActions pendingActions, String reason) {
   
        ActivityClientRecord r = mActivities.get(token);
        if (r != null) {
   
            if (userLeaving) {
   
                performUserLeavingActivity(r);
            }

            r.activity.mConfigChangeFlags |= configChanges;
            performPauseActivity(r, finished, reason, pendingActions);

            // Make sure any pending writes are now committed.
            if (r.isPreHoneycomb()) {
   
                QueuedWork.waitToFinish();
            }
            mSomeActivitiesChanged = true;
        }
    }
    /**
     * Pause the activity.
     * @return Saved instance state for pre-Honeycomb apps if it was saved, {@code null} otherwise.
     */
    private Bundle performPauseActivity(ActivityClientRecord r, boolean finished, String reason,
            PendingTransactionActions pendingActions) {
   
        if (r.paused) {
   
            if (r.activity.mFinished) {
   
                // If we are finishing, we won't call onResume() in certain cases.
                // So here we likewise don't want to call onPause() if the activity
                // isn't resumed.
                return null;
            }
            RuntimeException e = new RuntimeException(
                    "Performing pause of activity that is not resumed: "
                    + r.intent.getComponent().toShortString());
            Slog.e(TAG, e.getMessage(), e);
        }
        //finished入参值通过android native c方法传递进来,在点击返回键和调用activity finish方法时候为true
        if 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值