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 には任意の単純なレイアウトを使用できますが、注意が必要な部分はマニフェストにあります。

<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 を使用してこれを呼び出すと、「AnotherActivity」が Dialog として表示され、メイン アクティビティの上に表示されます。そのとき、メイン アクティビティは onPause 状態になります (MainActivity の onStop 状態は呼び出されません)。

于 2016-11-30T12:21:18.113 に答える
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

もう 1 つのオプションは、リフレクションを使用して Activity のプライベート メソッド performPause を呼び出すことです。原則として、次のようなものが機能するはずです。

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

まだテストしていないことに注意してください

于 2013-07-12T18:42:28.200 に答える