2012-01-13 17 views
2

Testing FundamentalsとAndroid開発者ドキュメントの「状態管理テストの追加」と題するActivity Testingセクションの両方において、使用試験活性が再起動を示唆している:アンドロイド活性試験 - 試験再起動

mActivity.finish(); 
mActivity = this.getActivity(); 

を加えてこれを試みました上記の2つのステートメントの間にスリープ状態があると、mActivity = this.getActivity()が実行されたときに、Activityが画面上に再描画されていないことがわかります。私のテストはうまくいくように見えますが、APIドキュメントでは触れられていないように、アクティビティが画面上に再描画されない理由について興味をそそられています。

私は誰にも分かるこの洞察に感謝します。 finish()メソッドが呼び出された時点で、アクティビティは画面から消えますが、this.getActivity()が呼び出されると再び表示されません。私もgetActivity()の後にmActivity.setVisible(true)を入れてみましたが、それは役に立ちません。

私のコードスニペットは、以下のようになります。

... 
mActivity.finish(); 
Thread.sleep(5000); 
mActivity = this.getActivity(); 
Thread.sleep(5000); 
... 

私が広範囲に検索したが、getActivity()が呼び出されたときに活動が再表示されない理由の任意の説明を見つけることができません。

私はこれをAndroid 2.3.5、2.3.3、および2.2.2で同じ結果でテストしました。

+1

は、この質問をしていただきありがとうございます! – Noumenon

答えて

8

ActivityInstrumentationTestCase2クラスでは、いくつかのクリーンアップを行う必要がある追加の仕上げメソッドが必要になると思われます。一方で、この問題を回避するには、アクティビティの終了後に自分自身をクリーンアップすることができます。したがって、コードを次のように変更してください。

mActivity.finish(); 
setActivity(null); 
mActivity = this.getActivity(); 

これは次のように説明できます。クラスActivityInstrumentationTestCase2におけるメソッドgetActivityはsetActivityを呼び出し(A)

public T getActivity() { 
    Activity a = super.getActivity(); 
    if (a == null) { 
     // set initial touch mode 
     getInstrumentation().setInTouchMode(mInitialTouchMode); 
     final String targetPackage = 
      getInstrumentation().getTargetContext().getPackageName(); 
     // inject custom intent, if provided 
     if (mActivityIntent == null) { 
      a = launchActivity(targetPackage, mActivityClass, null); 
     } else { 
      a = launchActivityWithIntent(targetPackage, 
             mActivityClass, 
             mActivityIntent); 
     } 
     setActivity(a); 
    } 
    return (T) a; 
} 

方法setActivityは内部変数mActivityIntentを設定します。

public void setActivityIntent(Intent i) { 
    mActivityIntent = i; 
} 

この最初のコールの後のすべてのコールで、null値の代わりに新しい値のmActivityIntentが使用されるようになりました。結果として

a = launchActivityWithIntent(targetPackage, mActivityClass, mActivityIntent); 

が呼び出されます。おそらくあなたのアプリはこの目的では起動できません。

方法rearDownは、適切なクリーンアップを行うことに注意してください:UIスレッドが画面上ではなかったとき、私のUIThreadコードが実行されないため

protected void tearDown() throws Exception { 
    // Finish the Activity off (unless was never launched anyway) 
    Activity a = super.getActivity(); 
    if (a != null) { 
     a.finish(); 
     setActivity(null); 
    } 
} 
+0

この回答は、onDestroyのテストの目的をすべて破った 'activity.finish()'の後にUIスレッドコードが不思議に走っていないという問題を修正しました。ありがとうございました。 – Noumenon

+0

ドキュメントから:アクティビティを終了して再起動してください: ** mActivity.finish(); ** ** mActivity = this.getActivity(); **実際にドキュメントを更新する必要があります... – Decoy

+0

ありがとうこれを見つける。 – Decoy