3

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

有什么想法吗?

我见过有人建议在其他线程中按下主页按钮,但是当我这样做时,会停止应用程序并调用 onStop 和 onPause,所以这并不是我想要的。

4

5 回答 5

15

取自此链接:最简单的方法是在您的活动之上添加一个半透明活动。我自己做了测试,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电话。

于 2013-07-10T20:11:22.063 回答
2

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

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

对于另一个活动,我将添加样式为“Theme.AppCompat.Dialog”意味着这将看起来像对话框。

如果您使用 Intent 调用 Main Activity,则“AnotherActivity”将显示为 Dialog ,它将进入 Main Activity 之上,届时主 Activity 将处于 onPause 状态(它不会调用 MainActivity 的 onStop 状态)

于 2016-11-30T12:21:18.113 回答
1

1)定义一个方法。

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

2)调用方法。

callLifeCycleMethod().callActivityOnDestroy(MainActivity.this);

或者

callLifeCycleMethod().callActivityOnPause(MainActivity.this);
于 2017-04-12T07:19:29.983 回答
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 中调用的

于 2013-07-11T14:07:27.270 回答
0

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

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

注意我还没有测试它

于 2013-07-12T18:42:28.200 回答