Android Activity生命周期测试

时间:2011-01-27 13:13:33

标签: android unit-testing

我有Activity,这是为了保存数据,以防系统决定在后台处理时将其杀死。 所以,我有onSaveInstanceState:

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

我在onCreate中检查Bundle对象是否为null:

@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 个答案:

答案 0 :(得分: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工具的代码:How to test onSaveInstanceState and onRestoreInstanceState on a real device

答案 1 :(得分:2)

对于手动测试,此例程有效:

  1. 启动您要测试的活动
  2. 点击设备上的主菜单按钮(活动停止)
  3. 从[{3}}(活动仍为DDMS
  4. 中删除该流程
  5. 再次从not destroyed
  6. 取回您的应用

    重新启动整个应用程序时,这会在您的活动上再次触发onCreate。如果你没有正确保存和加载状态,你很快就会知道。

答案 2 :(得分:0)

如果你之前没有通过它,我发现do this至少一次是值得的。

答案 3 :(得分:0)

可以使用robolectric轻松测试这样的东西。看看吧!