第五个项目——计数器2

实验目的

  • 掌握AndroidManifest.xml配置清单文件的结构;

  • 掌握使用Intent显式启动Activity的方式;

  • 掌握如何为Activity添加返回父Activity的方法;

实验要求

  • 能通过Intent对象向Activity传递数据;

实验内容

步骤一,打开名为Code02的Android工程

编译、部署该App,运行时点击COUNT按钮后,TextView文本控件的计数发生变化。此时点击AVD虚拟机 的Rotate按钮,TextView的计数将清零。导致该问题的原因是设备屏幕发生旋转时会导致Android系统的配置 发生改变,从而引起当前的Activity被销毁后重新被创建,详细描述见Activity的生命周期。

Activity被创建时,加载activity_ main.xml创建布局,在该布局文件中,我们对TextView设置了文本的初始值为0。 因此,每当设备屏幕发生旋转时,TextView的计数值都被清零。解决该问题的方法是每次Activity销毁时保存计数值,Activity被重新 创建时在将保存的计数值设置为TextView显示的文本。

步骤二,保存计数值

Activity被销毁时,可在onSaveInstanceState()方法中保存计数值。Activity被重新创建时,可在 onCreate()方法或onRestoreInstanceState()方法中恢复TextView显示的计数值。

如下代码所示,onSaveInstanceState()方法传递一个Bundle对象,该对象以键值对形式 保存Activity的状态信息(包括布局状态),待Activity被重新创建时,Android运行时将该Bundle对象传递给onCreate()方法或onRestoreInstanceState()方法。 通过Bundle对象的putInt()可以保存int型的数值。

public class MainActivity extends AppCompatActivity {

    private static final String COUNT_VALUE = "count_value";
    private int count = 0;

    @Override
     protected void onSaveInstanceState(Bundle outState) \{ 
         outState.putInt(COUNT_ VALUE, count); 
         super.onSaveInstanceState(outState); 
    }
    ...
}

步骤三,读取计数值

Activity被重新创建时,之前保存的Bundle对象将被传递给onCreate()方法或onRestoreInstanceState()方法。 这两个方法中使用Bundle参数有所区别,前者需要判断传递进入的Bundle参数是否为null,而后者不需要判断。

我们选择在onRestoreInstanceState()方法中恢复计数值,使用Bundle对象的getInt()方法可获取之前保存的计数器的值,代码如下所示。

public class MainActivity extends AppCompatActivity {
    ...
     TextView tvCount; 

    @Override
     protected void onRestoreInstanceState(Bundle savedInstanceState) \{ 
        super.onRestoreInstanceState(savedInstanceState);

         count = savedInstanceState.getInt(COUNT_ VALUE); 
        if (tvCount != null) {
             tvCount.setText(Integer.toString(count)); 
        }
    }

步骤四,重新编译工程并查看运行结果

重新编译、部署App后,点击AVD虚拟机的Rotate按钮,查看TextView的计数值是否有改变。

实验小结

通过本次实验,你应该掌握了如下知识内容:

  • Activity生命周期的各状态;

  • 使用AVD虚拟机的Rotate按钮旋转设备屏幕;

  • 使用onSaveInstanceState方法保存Activity状态;

  • 使用onRestoreInstanceState方法恢复Activity状态;

Last updated

Was this helpful?