onCreate中的savedInstanceState有何具体作用?

本文详细介绍了Android Activity在生命周期中的savedInstanceState机制,包括如何在onSaveInstanceState()方法中保存状态信息,以及如何在onRestoreInstanceState()方法中恢复状态信息。通过示例代码展示在Activity被KILL前如何保存其状态,确保应用重启后能继续从前一状态运行。
在activity的生命周期中,只要离开了可见阶段,或者说失去了焦点,activity就很可能被进程终止了!,被KILL掉了,,这时候,就需要有种机制,能保存当时的状态,这就是savedInstanceState的作用。

当一个Activity在PAUSE时,被kill之前,它可以调用onSaveInstanceState()来保存当前activity的状态信息(在paused状态时,要被KILLED的时候)。用来保存状态信息的Bundle会同时传给两个method,即onRestoreInstanceState() and onCreate().

示例代码如下:

package com.myandroid.test;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

public class AndroidTest extends Activity {

private static final String TAG = "MyNewLog";

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// If an instance of this activity had previously stopped, we can

// get the original text it started with.

if(null != savedInstanceState)

{

int IntTest = savedInstanceState.getInt("IntTest");

String StrTest = savedInstanceState.getString("StrTest");

Log.e(TAG, "onCreate get the savedInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);

}

setContentView(R.layout.main);

Log.e(TAG, "onCreate");

}



@Override

public void onSaveInstanceState(Bundle savedInstanceState) {

// Save away the original text, so we still have it if the activity

// needs to be killed while paused.

savedInstanceState.putInt("IntTest", 0);

savedInstanceState.putString("StrTest", "savedInstanceState test");

super.onSaveInstanceState(savedInstanceState);

Log.e(TAG, "onSaveInstanceState");

}



@Override

public void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

int IntTest = savedInstanceState.getInt("IntTest");

String StrTest = savedInstanceState.getString("StrTest");

Log.e(TAG, "onRestoreInstanceState+IntTest="+IntTest+"+StrTest="+StrTest);

}

}
你提供的 `LoginActivity` 代码中,你在 `onCreate` 方法中创建了一个名为 `PP_ToUFragment` 的 BottomSheetDialogFragment(或 Fragment),并尝试通过 `supportFragmentManager` 显示它。然而,这会导致一些潜在的问题,尤其是如果你没有正确设置 Fragment 的显示方式或没有对应的布局。 ### 可能的问题与建议 1. **未设置 Activity 的布局** 你没有调用 `setContentView()` 来设置 `LoginActivity` 的布局文件,这通常不是问题,除非你只是展示一个 Fragment 而不需要自己的 UI。但如果需要 UI 配合,记得加上: ```kotlin setContentView(R.layout.activity_login) ``` 2. **BottomSheetDialogFragment 的使用方式** 如果 `PP_ToUFragment` 是继承自 `BottomSheetDialogFragment`,那么它的显示方式是弹窗形式,不需要依赖 `fragment_container`,所以不会出现你之前提到的 `No view found for id` 错误。 3. **Fragment 显示时机问题** 在 `onCreate` 中直接显示 Fragment 是可以的,但如果你的 Fragment 依赖某些 UI 元素或生命周期事件(如 `onViewCreated`),请确保它不会在 Activity 初始化完成前执行复杂逻辑。 --- ### 示例修复代码(如果你使用的是 BottomSheetDialogFragment): ```kotlin class LoginActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) // 如果有布局的话 val bottomSheet = PP_ToUFragment() bottomSheet.show(supportFragmentManager, "PP_ToUFragment") } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值