如何测试为保存/恢复活动的生命周期而构建的代码?

时间:2010-03-28 16:01:22

标签: android android-activity lifecycle

如何测试以下所有方法代码?我想在所有这些场景发生时播放场景,看看我的代码是否适用于活动的保存/恢复过程。那么我应该在模拟器中做些什么来测试所有方法?

public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState);

     protected void onStart();

     protected void onRestoreInstanceState(Bundle savedInstanceState);

     protected void onSaveInstanceState(Bundle savedInstanceState);

     protected void onRestart();

     protected void onResume();

     protected void onPause();

     protected void onStop();

     protected void onDestroy();
 }

6 个答案:

答案 0 :(得分:144)

如果您在设备上启用了开发者选项,则会有一个选项不要保留活动,这有助于测试onRestoreInstanceState()

Android Settings panel

答案 1 :(得分:13)

我们遇到了一个问题,即在长时间不活动后重新启动应用程序会崩溃。我们发现"不要保持活动"没有重现这个问题,但Dev Settings中的Background process settings :: No background processes确实存在(即使在调试时)。

答案 2 :(得分:8)

要测试onSaveInstanceState和onRestoreInstanceState,您可以使用SetAlwaysFinish工具(请参阅下面的链接)或模拟器附带的DevTools应用程序。

http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

这两个应用程序都使用名为AlwaysFinish的隐藏设置,它是ActivityManagerNative类的一部分,用于更改Android操作系统的行为。在新行为下,操作系统将在离开屏幕后立即卸载任何活动,从而触发onSaveInstanceState事件。当操作系统想要恢复活动时,它将调用onRestoreInstanceState事件。

上面的链接解释了如何使用SetAlwaysFinish应用程序来测试应用程序的onSaveInstanceState和onRestoreInstanceState事件。如果要使用DevTools,请启用开发设置>立即摧毁活动。

答案 3 :(得分:6)

当您启动应用程序时,

onCreateonStartonResume将会运行,无需进一步的交互。退出时会运行onPauseonStoponDestroy,例如反复按“返回”按钮。

要在启动应用程序后测试onRestartonSaveInstanceStateonRestoreInstanceState,请尝试按主页按钮,启动其他一些应用程序以确保您的活动将被终止,然后启动您的应用程序试。

使用日志记录检查方法是否已被调用。

(活动生命周期文档:http://developer.android.com/guide/topics/fundamentals.html#actlife

答案 4 :(得分:2)

还有另一种测试这些事件的方法。首先,您必须导航到要测试的特定活动,然后按主页按钮并转到Android设备监视器。

Android device monitor location

Android device monitor example

在此工具中,您可以选择应用程序的线程并使用停止按钮将其终止。 最后,您必须从历史记录中打开应用程序,线程将再次重新创建。

答案 5 :(得分:1)

Android提供的测试工具现在提供了一种编写测试的方法,该测试可以将活动从一种状态驱动到另一种状态,或者重新创建活动以测试保存和还原流程。有关功能列表,请参见Test your app's activities Android开发者文档页面。从该页面获取的语法示例如下:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        val scenario = launchActivity<MyActivity>()
        scenario.moveToState(State.CREATED)
    }
}