我正在嘗試解決如何模擬暫停用於調試我的應用程序的活動。我想onPause被調用,但不是onStop。我只想嘗試一個暫停恢復週期,並且正在尋找一些我可以調用的代碼(例如按下按鈕之後)來觸發此操作。如何在Android活動中以編程方式觸發onPause
任何想法如何?
我看到有人建議在其他線程中按Home鍵,但是當我這樣做是停止應用程序,並調用onStop以及onPause,所以它不是我所期待的。
我正在嘗試解決如何模擬暫停用於調試我的應用程序的活動。我想onPause被調用,但不是onStop。我只想嘗試一個暫停恢復週期,並且正在尋找一些我可以調用的代碼(例如按下按鈕之後)來觸發此操作。如何在Android活動中以編程方式觸發onPause
任何想法如何?
我看到有人建議在其他線程中按Home鍵,但是當我這樣做是停止應用程序,並調用onStop以及onPause,所以它不是我所期待的。
取自此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
電話。
謝謝,我會給它一個去 - 我嘗試了一些類似的東西,使對話框顯示在我的屏幕上,失敗了,但我沒有爲那個 – user2022581
做出單獨的活動.gunar先生總結了它。但我只想說,並非所有的半透明活動都會調用onPause。如對話框,因爲對話框使用當前活動的上下文。我希望我澄清一點。 – Coderji
好吧試了一下,這對我很有用,所以謝謝。我只是希望有一種方法可以在沒有製作gui元素和活動的情況下排成一行。所以我可能還會看看我今天發現的這個Instrumentation類(我是Android的新手),並且從中看到了這樣做。 – user2022581
另一種調試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調用的
另一個選擇可能是使用反射來調用Activity中的私有方法performPause。 像這樣的東西應該在工作原理:
Method method = myactivity.getClass().getSuperclass().getDeclaredMethod("performPause");
method.setAccessible(true);
method.invoke(myactivity);
注意,我還沒有測試它
簡單的辦法,從Mainactivity我會使用意圖調用另一個活動。在清單,我會定義爲
<activity android:name=".AnotherActivity"
android:theme="@style/Theme.AppCompat.Dialog" >
</activity>
手段另一個活動,我將添加樣式爲「Theme.AppCompat.Dialog」是指這會看起來對話框。
如果您使用Intent調用此函數,那麼「AnotherActivity」將顯示爲Dialog,它將進入Main活動之上,那時主活動將處於onPause狀態(它不會調用onStop狀態MainActivity)
1)定義一個方法。
public static Instrumentation callLifeCycleMethod()
{
return new Instrumentation();
}
2)調用方法。
callLifeCycleMethod().callActivityOnDestroy(MainActivity.this);
或
callLifeCycleMethod().callActivityOnPause(MainActivity.this);
爲什麼你不想要的onStop()被調用?不會有真正的生活情況,只有onPause()被調用... – Joel
非常確定onStop總是在onPause之後被調用。看看一個活動的生命週期http://developer.android.com/images/activity_lifecycle.png – tyczj