重新创建Activity

重新创建Activity

   

在有些情况下,您的Activity会因正常应用行为而销毁,比如当用户按 返回按钮或您的Activity通过调用 finish()示意自己的销毁。 如果Activity当前被停止或长期未使用,或者前台Activity需要更多资源以致系统必须关闭后台进程恢复内存,系统也可能会销毁Activity。

当您的Activity因用户按了返回 或Activity自行完成而被销毁时,系统的 Activity 实例概念将永久消失,因为行为指示不再需要Activity。 但是,如果系统因系统局限性(而非正常应用行为)而销毁Activity,尽管 Activity 实际实例已不在,系统会记住其存在,这样,如果用户导航回实例,系统会使用描述Activity被销毁时状态的一组已保存数据创建Activity的新实例。 系统用于恢复先前状态的已保存数据被称为“实例状态”,并且是 Bundle 对象中存储的键值对集合。

注意:每次用户旋转屏幕时,您的Activity将被销毁并重新创建。 当屏幕方向变化时,系统会销毁并重新创建前台Activity,因为屏幕配置已更改并且您的Activity可能需要加载备用资源(比如布局)。

默认情况下,系统会使用 Bundle 实例状态保存您的Activity布局(比如,输入到 EditText 对象中的文本值)中有关每个 View 对象的信息。 这样,如果您的Activity实例被销毁并重新创建,布局状态便恢复为其先前的状态,且您无需代码。 但是,您的Activity可能具有您要恢复的更多状态信息,比如跟踪用户在Activity中进度的成员变量。

注意:为了 Android 系统恢复Activity中视图的状态,每个视图必须具有 android:id 属性提供的唯一 ID。

要保存有关Activity状态的其他数据,您必须替代 onSaveInstanceState() 回调方法。当用户要离开Activity并在Activity意外销毁时向其传递将保存的Bundle 对象时,系统会调用此方法。 如果系统必须稍后重新创建Activity实例,它会将相同的 Bundle 对象同时传递给 onRestoreInstanceState() 和onCreate() 方法。

图 2.当系统开始停止您的Activity时,它会 调用 onSaveInstanceState() (1),因此,您可以指定您希望在 Activity 实例必须重新创建时保存的额外状态数据。如果Activity被销毁且必须重新创建相同的实例,系统将在 (1) 中定义的状态数据同时传递给 onCreate() 方法(2) 和 onRestoreInstanceState() 方法(3)。

保存Activity状态


当您的Activity开始停止时,系统会调用 onSaveInstanceState() 以便您的Activity可以保存带有键值对集合的状态信息。 此方法的默认实现保存有关Activity视图层次的状态信息,例如 EditText 小工具中的文本或ListView 的滚动位置。

要保存Activity的更多状态信息,您必须实现 onSaveInstanceState() 并将键值对添加至 Bundle 对象。 例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
    
    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

注意:始终调用 onSaveInstanceState() 的超类实现,以便默认实现可以保存视图层次的状态。

恢复Activity状态


当您的Activity在先前销毁之后重新创建时,您可以从系统向Activity传递的 Bundle 恢复已保存的状态。onCreate() 和 onRestoreInstanceState() 回调方法均接收包含实例状态信息的相同 Bundle

因为无论系统正在创建Activity的新实例还是重新创建先前的实例,都会调用 onCreate() 方法,因此您必须在尝试读取它之前检查状态 Bundle 是否为 null。 如果为 null,则系统将创建Activity的新实例,而不是恢复已销毁的先前实例。

例如,此处显示您如何可以在 onCreate() 中恢复一些状态数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first
   
    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

您可以选择实现系统在 onStart() 方法之后调用的 onRestoreInstanceState() ,而不是在onCreate() 期间恢复状态。 系统只在存在要恢复的已保存状态时调用 onRestoreInstanceState() ,因此您无需检查 Bundle 是否为 null:

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);
   
    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}

注意:始终调用 onSaveInstanceState() 的超类实现,以便默认实现可以恢复视图层次的状态。

要了解更多有关因运行时重启事件(例如屏幕旋转时)而重新创建Activity的信息,请阅读处理运行时更改


原本地址

<think>嗯,用户问的是如何在Android中创建一个新的Activity组件。首先,我需要回顾一下Android开发的基础知识,特别是关于Activity创建步骤。记得Activity是四大组件之一,每个界面通常对应一个Activity。 根据提供的引用内容,创建Activity的步骤大致包括手动创建类、布局文件,以及在AndroidManifest.xml中注册。另外,引用2提到Android Studio有快捷方式,可以直接右键新建Activity,这可能更方便。需要分步骤说明,可能用户是新手,所以步骤要详细。 第一步,手动创建Activity类。需要继承AppCompatActivity,并重写onCreate方法。这里要注意使用setContentView绑定布局,如引用3中的例子用了View Binding,可能需要提到不同的方法,比如直接使用R.layout.activity_main。 第二步,创建对应的布局文件。在res/layout下新建XML文件,比如activity_second.xml,然后设计UI元素。需要说明布局文件的作用和如何关联到Activity。 第三步,在AndroidManifest.xml中注册Activity。这里要提到<activity>标签,以及可能的intent-filter设置,尤其是LAUNCHER Activity需要MAIN action和LAUNCHER category,如引用5所述。如果新Activity不是主入口,可能不需要这些,但注册还是必须的。 另外,引用2提到的快捷方式可能更适合新手,步骤更简单。需要比较手动和自动两种方法,用户可能想知道更高效的方式。 可能还需要提到如何启动Activity,比如使用Intent跳转,如引用1中的代码示例。虽然用户的问题主要是创建,但启动也是相关联的步骤,可以放在相关问题里。 要注意引用内容的正确应用,比如引用4解释了Activity的作用,可以用于说明为什么需要创建Activity。引用5关于配置主Activity的部分很重要,特别是设置intent-filter,确保应用知道从哪里启动。 还要检查是否有遗漏的步骤,比如布局文件的命名和引用是否正确,注册时的name属性是否包含完整的包名类名。如果有错误,比如忘记注册Activity,应用会崩溃,所以必须强调这一点。 最后,整理步骤,分点说明,确保逻辑清晰。可能用户需要代码示例,比如如何编写Activity类和布局XML,但根据问题,用户主要关注创建过程,所以代码示例可能放在回答中,如引用3中的Kotlin代码。 可能的相关问题包括如何跳转到新Activity,生命周期管理,或者如何优化布局,这些可以作为后续问题推荐。</think>### 如何在Android中创建新的Activity组件? #### 1. **手动创建Activity的步骤** - **步骤1:创建Activity类** 新建一个继承自`AppCompatActivity`的类(如`SecondActivity`),并重写`onCreate`方法,绑定布局文件: ```kotlin class SecondActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) // 绑定布局文件 } } ``` 引用示例见[^3]。 - **步骤2:创建布局文件** 在`res/layout`目录下新建XML布局文件(如`activity_second.xml`),定义UI元素: ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:text="这是第二个Activity" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> ``` - **步骤3:注册Activity** 在`AndroidManifest.xml`中添加`<activity>`标签声明: ```xml <application> <!-- 主Activity --> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 新创建Activity --> <activity android:name=".SecondActivity" /> </application> ``` 注意:主Activity需添加`MAIN`和`LAUNCHER`的`intent-filter`[^5]。 #### 2. **使用Android Studio快捷创建** - 右键点击项目包 -> `New` -> `Activity` -> 选择模板(如`Empty Activity`) - 输入`Activity Name`和`Layout Name`,工具会自动生成类和布局文件,并完成注册[^2]。 #### 3. **启动新Activity** 在代码中使用`Intent`跳转: ```java Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); ``` 引用示例见[^1][^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值