安卓Activity生命周期测试

6

我有一个Activity,当它在后台运行时,系统可能会决定将其杀死,因此需要保存其数据。因此,我使用了onSaveInstanceState方法:

@Override
protected void onSaveInstanceState(Bundle outState){
    outState.putString("value", "some_value");
}

我在onCreate方法中检查Bundle对象是否为空:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    isRestarted=(savedInstanceState==null);

我该如何编写测试方法?我尝试了。
    public void testRecreate(){
    Instrumentation mInstr=this.getInstrumentation();
    mInstr.callActivityOnSaveInstanceState(mActivity, null);
    mActivity.finish();
    mActivity=this.getActivity();
    assertEquals(false, mActivity.isRestarted);
}

但是似乎是错误的。

4个回答

6
你可以使用一些隐藏的API功能。在你的测试设置中,调用以下代码:
android.app.ActivityManagerNative.getDefault().setAlwaysFinish()

通过反射方式调用方法(因为它是一个隐藏的API),并确认已成功设置值

android.provider.Settings.System.getInt(getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0)

然后在测试清理中,将此设置重新设置为false。

启用AlwaysFinish设置会导致系统立即销毁不再显示的活动,立即触发onSaveInstanceState事件。为了使此代码工作,您需要ALWAYS_FINISHWRITE_SETTINGS权限。

请参见此博客中链接的SetAlwaysFinish工具的代码:如何在真实设备上测试onSaveInstanceState和onRestoreInstanceState


感谢你抽出时间来编写这篇文章,Theo。干得好! - ohhorob
我无法让setAlwaysFinish.apk在Android 4.0.3上工作。它启动了,但勾选复选框没有任何效果。要注意,如果活动结束后onCreate未被调用,则setAlwaysFinish将无法发挥作用。 - Nilzor

2

对于手动测试,可以按照以下步骤进行:

  1. 启动您想要测试的活动
  2. 点击设备上的主菜单按钮(活动停止)
  3. DDMS中终止该进程(活动仍然未销毁
  4. 再次从最近使用应用列表中打开您的应用程序

这样应该会触发您的活动上的onCreate方法,而不是重新启动整个应用程序。如果您没有正确保存和加载状态,很快就会知道。


0

如果你以前没有经历过这个过程,我发现至少做一次这个是值得的。


http://developer.android.com/resources/tutorials/testing/activity_test.html => 链接已损坏 :( - Macarse
我已经经历过这个问题,但我的问题似乎有点更加复杂。 - user468311

0

这类东西可以很容易地使用robolectric进行测试。去看看吧!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接