2013-07-10 88 views
3

我正在嘗試解決如何模擬暫停用於調試我的應用程序的活動。我想onPause被調用,但不是onStop。我只想嘗試一個暫停恢復週期,並且正在尋找一些我可以調用的代碼(例如按下按鈕之後)來觸發此操作。如何在Android活動中以編程方式觸發onPause

任何想法如何?

我看到有人建議在其他線程中按Home鍵,但是當我這樣做是停止應用程序,並調用onStop以及onPause,所以它不是我所期待的。

+1

爲什麼你不想要的onStop()被調用?不會有真正的生活情況,只有onPause()被調用... – Joel

+1

非常確定onStop總是在onPause之後被調用。看看一個活動的生命週期http://developer.android.com/images/activity_lifecycle.png – tyczj

回答

13

取自此link:最簡單的方法是在您的活動之上添加半透明活動。我做了測試自己和onStop的確不是叫:

透明的活動:

public class TransparentActivity extends FragmentActivity { 
    @Override 
    protected void onCreate(Bundle arg0) { 
     super.onCreate(arg0); 
     setContentView(R.layout.transparent_layout); 
    } 
} 

任何簡單的佈局可用於transparent_layout,但棘手的部分是在清單:

<activity 
      android:name=".TransparentActivity" 
      android:theme="@style/Theme.Transparent" > 
     </activity> 

其中styles.xml:

在起動一個
<style name="Theme.Transparent" parent="android:Theme"> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
    <item name="android:backgroundDimEnabled">false</item> 
</style> 

然後ctivity:

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     findViewById(R.id.btnNext).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(MainActivity.this, TransparentActivity.class)); 
      } 
     }); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.d("TSTAct", "#onPause"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("TSTAct", "#onStop"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.d("TSTAct", "#onResume"); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("TSTAct", "#onStart"); 
    } 
} 

當打開TransparentActivity我可以只在logcat中看到:

07-10 23:35:28.323: D/TSTAct(27180): #onPause 

沒有onStop電話。

+0

謝謝,我會給它一個去 - 我嘗試了一些類似的東西,使對話框顯示在我的屏幕上,失敗了,但我沒有爲那個 – user2022581

+3

做出單獨的活動.gunar先生總結了它。但我只想說,並非所有的半透明活動都會調用onPause。如對話框,因爲對話框使用當前活動的上下文。我希望我澄清一點。 – Coderji

+1

好吧試了一下,這對我很有用,所以謝謝。我只是希望有一種方法可以在沒有製作gui元素和活動的情況下排成一行。所以我可能還會看看我今天發現的這個Instrumentation類(我是Android的新手),並且從中看到了這樣做。 – user2022581

0

另一種調試onPause和onResume的方法是使用Android測試框架。在活動的測試,你可以得到一個規範的對象,然後觸發暫停和恢復:我只是用一個虛擬的斷言這裏

import android.app.Instrumentation; 
import android.test.ActivityInstrumentationTestCase2; 

public class LaunchActivityTest extends ActivityInstrumentationTestCase2<LaunchActivity> { 

    private LaunchActivity launchActivity; 

    public LaunchActivityTest() { 
     super(LaunchActivity.class); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    protected void setUp() throws Exception { 

     super.setUp(); 
     launchActivity = getActivity(); 
    } 

    @Override 
    protected void tearDown() throws Exception { 

     super.tearDown(); 
    } 

    public void testPause() { 

     Instrumentation ins = getInstrumentation(); 
     ins.callActivityOnPause(launchActivity); 
     assertEquals(true, true); 
     ins.callActivityOnResume(launchActivity); 
    } 

} 

注意。另外我還不確定我怎麼能斷言這些方法是用Java調用的

0

另一個選擇可能是使用反射來調用Activity中的私有方法performPause。 像這樣的東西應該在工作原理:

Method method = myactivity.getClass().getSuperclass().getDeclaredMethod("performPause"); 
method.setAccessible(true); 
method.invoke(myactivity); 

注意,我還沒有測試它

1

簡單的辦法,從Mainactivity我會使用意圖調用另一個活動。在清單,我會定義爲

<activity android:name=".AnotherActivity" 
       android:theme="@style/Theme.AppCompat.Dialog" > 
    </activity> 

手段另一個活動,我將添加樣式爲「Theme.AppCompat.Dialog」是指這會看起來對話框。

如果您使用Intent調用此函數,那麼「AnotherActivity」將顯示爲Dialog,它將進入Main活動之上,那時主活動將處於onPause狀態(它不會調用onStop狀態MainActivity)

0

1)定義一個方法。

public static Instrumentation callLifeCycleMethod() 
{ 
    return new Instrumentation(); 
} 

2)調用方法。

callLifeCycleMethod().callActivityOnDestroy(MainActivity.this); 

callLifeCycleMethod().callActivityOnPause(MainActivity.this); 
相關問題