2

複数のアクティビティを伴う単純なアプリケーションを作成しています。私のアプリケーションは、特定のシステム設定に基づいて2つのアクティビティのいずれかを再開する必要があります。Dispatcherこのため、にリンクされているクラスを実装しました。このクラスは、コールバック内のシステム環境設定を調べてaction.MAIN、正しいクラスを開始します。ActivityonResume()

問題

私はでこれを行っているのでonResume()、結果のアクティビティのいずれかで戻るボタンを押すと、Dispatcherが再開され、その結果、同じものActivityを再度開始しようとします。これにより、ユーザーがホームボタンを押さない限り、アプリケーションを離れることができなくなります。

いくつかのコード

これが私の状況を明確にするのに役立つ私のクラスからのいくつかのコードの抜粋です:

Dispatcher.onResume(void):void

protected void onResume() {

    super.onResume();

    if(!handled){

        Intent activity_switcher;

        //If a game is active...
        if(manager.isGameActive()){

            //Start the the Game Manager with the appropriate game.
            activity_switcher = new Intent(this, GameManager.class);
        }
        //If a game is not active... 
        else{

            //Start the Game Menu
            activity_switcher = new Intent(this, Menu.class);
        }

        //Start the appropriate activity
        startActivity(activity_switcher);
        overridePendingTransition(0, 0);
    }
    else{

        //Finish the application
        finish();
        overridePendingTransition(0, 0);
    }
}

いくつかの変数は次のとおりです。

  • managerシステム環境設定とインターフェイスするクラスを表す変数です。
  • handledイベントがまだ処理されているかどうかを判断する変数です(以下の「解決策#1の試行」を参照)

試みられた解決策#1

handledアクティビティが開始される前にテストされるブールクラス変数、を実装することを検討しました。値がであることがわかった場合trueDispatchersimpleはを呼び出しfinish()ますが、値がfalseである場合、適切なアクティビティが開始され、アプリケーションがこれに戻ったときに単純に終了するようにhandled設定されます。trueActivity

これは機能しません。なぜなら...

ユーザーが結果のアクティビティの1つでホームボタンを押した場合、アプリケーションを再開すると、ディスパッチャアクティビティに配置され、処理されたと見なされるため、アプリケーションはすぐに終了します(変数は引き続きtrue) 。

試みられた解決策#2

Dispatcherアプリケーションのライフサイクルごとに1回だけ実行する方法を見つけようとしました。これは、起動時に1回だけ実行する必要Dispatcherがあるため、ユーザーがに戻ることを望まないため、理にかなっています。Activityそこで、onResume()が呼び出されるたびにインクリメントされ、finish()が呼び出されるたびに0に減少するカウンターを含めました。

これは機能しません。なぜなら...

この場合も、ユーザーがホームボタンを押すと、アプリケーションが再起動されると、アプリケーションはDispatcherすでに1回実行されたと見なされ(への呼び出しがなかったため)、すぐに終了しますfinish()

試みられた解決策#3

どのアクティビティが以前にアクティブであったかを何らかの方法で判断できれば、ユーザーが戻るボタンを押した場合に動的に反応し、それから終了するように通知するだけDispatcherで、すぐに終了することはできないと考えました。ユーザーがホームボタンを押した場合。

これはreturningFromMenu()、メニューから呼び出されたときに、終了するように通知Activityするフラグをクラスで発生させる静的関数を使用して実現されました。Dispatcher

試行されたソリューション#4(現在の実装)

このアクティビティ切り替えコードをすべてonCreate()に移動するだけです。これにより、の「1回限り」の性質が強制されDispatcherます。

これはうまくいくかもしれません、なぜなら...

これは、ユーザーがアクティビティに戻る場合(onResume()を使用)を処理します。フラグがないため、ホームボタンを押してアプリケーションに戻るときに問題はありません。


私の質問

Activity静的メソッドまたはメンバーを使用する以外に、どちらが最後に終了したかを判別する方法はありますか?これは非常に悪い習慣であることを私は知っており、可能であればそれを避けたいと思います。

更新

最終更新日:2013年2月12日15:45 EST

アプローチ#4は私の目的には役立っているようですが、ここでの質問は開発者にとって非常に役立つと思います。より包括的なソリューションを投稿するのに十分な時間が与えられるまで、質問に答えることは控えます。

4

1 に答える 1

0

ソリューション

上記の「更新」で述べたように、この問題はonCreate()、切り替えが1回だけ行われるようにコードをに移動するだけで解決されました。finish()同様に、バックスタックから呼び出し元のアクティビティを削除するために、アクティビティを開始した直後に単に呼び出しを行うこともできます。

コメント欄にご尽力いただき、誠にありがとうございます!

于 2013-02-15T20:31:31.190 に答える