如何在android活动中以编程方式触发onPause

时间:2013-07-10 20:05:56

标签: android activity-lifecycle

我正在尝试解决如何模拟暂停活动以调试我的应用程序。我希望onPause被调用但不是onStop。我只是想尝试一个暂停的恢复周期,我正在寻找一些可以调用的代码(例如按下按钮后)来触发它。

任何想法如何?

我看到有人建议在其他线程中按下主页按钮但是当我这样做时会停止应用并调用onStop以及onPause,因此它不是我想要的。

5 个答案:

答案 0 :(得分:13)

取自link:最简单的方法是在您的活动之上添加半透明活动。我自己做了测试,onStop确实没有被调用:

透明活动:

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

任何简单的布局都可以用于transparent_layout,但棘手的部分是在Manifest中:

<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>

然后在入门活动中:

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来电。

答案 1 :(得分:1)

简单的方法,从Mainactivity我将使用Intent调用另一个活动。在Manifest中,我将定义为

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

另一项活动的意思我将添加样式为&#34; Theme.AppCompat.Dialog&#34;意味着这将看作对话。

如果您使用Intent调用此主活动,那么&#34; AnotherActivity&#34;将显示为Dialog,它将进入Main活动之上,那时主活动将处于onPause状态(它不会调用onAtop MainActivity状态)

答案 2 :(得分:0)

调试onPause和onResume所发生的事情的另一种方法是使用Android测试框架。在活动测试中,您可以获取Instrumentation对象,然后触发暂停和恢复:

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中调用这些方法

答案 3 :(得分:0)

另一种选择可能是使用反射调用Activity中的私有方法performPause。 这样的事情应该原则上起作用:

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

注意我还没有测试它

答案 4 :(得分:0)

1)定义一个方法。

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

2)通话方法。

callLifeCycleMethod().callActivityOnDestroy(MainActivity.this);

callLifeCycleMethod().callActivityOnPause(MainActivity.this);