3

スプラッシュ画面付きのAndroidアプリがあります。

このスプラッシュ画面はデータをプリロードし、終了するとアプリケーションのメインアクティビティを開始して終了します(finish()呼び出しを介して)。

これは、アプリケーションが完全に強制終了されない限り、非常にうまく機能します。そのため、通常は通常どおり、さまざまなタスクを切り替えることができます。サブアクティビティからアプリを離れ、このサブアクティビティが表示された直後に戻る場合です。

さて、私がこのサブアクティビティを離れてしばらくの間他のことをすると、必然的にこのアプリケーションプロセスはOSによって強制終了されます。

今のところ問題ありません。これで、Androidがプリロードを認識せずに(データがプリロードされていない場合は時間がかかるか、一部のフォントが表示されないが、Androidはどこかでプリロードを実行していることを認識できない)、サブアクティビティを復元することを期待します。バンドルから。ただし、スプラッシュ画面アクティビティは開始されます。

だから、私は言う、それならそれでいい...スプラッシュスクリーンの活動は結局のところランチャー/メインの活動です。さて、私が持っている実際の謎は次のとおりです。

この新しくロードされたスプラッシュ画面から戻るボタンを押すと、アプリケーションが強制終了される前にアプリケーションを終了したサブアクティビティが表示されます。私は本当にこれを理解していません。どうやらAndroidDIDは、リロードするサブアクティビティの状態(およびその履歴スタック)を保存しますが、リロードする代わりに、スプラッシュ画面を開始することを選択しました。このサブアクティビティ(タスクが強制終了される前にタスクを終了しました)を1ステップ戻します。アクティビティスタック。

なぜこれが起こるのですか?

プロセスが強制終了されていない場合は、中断したところに戻すことができます。それが殺されたとき、私はできません(まだそのアプリの以前の履歴全体を復元しています)。後者の場合、Androidは状態などをロードする必要があることは知っていますが、それは問題ではなく、デフォルトで自動的に実行されます(ドキュメントによると)。

PS私は特別なことは何もしていません。デフォルトの起動フラグ、上書きされた状態復元メソッドなどはありません。

4

2 に答える 2

2

ちょっとこれを試してみてください。ブールフラグを1つ取得する必要があるので、この問題を処理します。スプラッシュ画面の読み込み中に戻るボタンを押すと、そのアクティビティが停止するため、自動再読み込みの問題が解決します。

public class Main extends Activity {

    ImageView imageLogo;
    LinearLayout myLayout;
    private Thread splashTread;
    private boolean isBackPressed = false;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        splashTread = new Thread() {
            public void run() {
                try {
                    sleep(3000);
                    if (!isBackPressed) {

                        Intent myIntent = new Intent(
                                "src.SplashScreen.com.MENU");
                        startActivity(myIntent);

                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                finally {

                    finish();

                }
            }

        };

        splashTread.start();

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            isBackPressed = true;
            finish();
        }
        return super.onKeyDown(keyCode, event);

    }

}
于 2012-06-02T07:11:52.873 に答える
0

これは、2つのアプリケーションインスタンスに関する既知のAndroidの問題です。この問題は、ここここで公式に追跡されています。

回避策はこちらです。

于 2010-11-08T20:33:10.260 に答える