0

アクティビティがセンサー入力に応答し続けるようにするために、現在、onCreate() メソッド内で新しいスレッドを開始しています。これは、UI スレッドが読み込みメッセージとロゴを表示している間に、すべての必要なリソースを初期化します。この初期化プロセス中にユーザーがホーム ボタンを押した場合、アクティビティの on pause() メソッドを使用して、通知があるまで待機するようにこのスレッドに通知します。この待機状態の間、または戻るボタンが押されたときにアクティビティが実際に破棄された場合、現在、不完全な初期化スレッドを中断して破棄するために ondestroy() メソッドに依存しています。

残念ながら、ホーム画面からアイコンを選択してアプリケーションを再開すると、アクティビティの onCreate() メソッドが呼び出され、既存の初期化スレッドを強制終了するために onDestroy() メソッドを呼び出すことなく、新しい初期化スレッドが作成されることがあります。このシナリオで onDestroy() が常に呼び出されるとは限らない場合、既存の初期化スレッドを破棄する必要があるかどうかをどのように判断できますか?

この問題に関するヘルプやアドバイスをいただければ幸いです。

4

1 に答える 1

0

必要に応じて異なりますが、マニフェストでアクティビティの起動モードを変更するだけで十分な場合があります。

android:launchMode="singleTask"

対照的に、「singleTask」および「singleInstance」アクティビティは、タスクを開始することしかできません。それらは常にアクティビティ スタックのルートにあります。さらに、デバイスが一度に保持できるアクティビティのインスタンスは 1 つだけです。そのようなタスクは 1 つだけです。

これにより、onDestroy の前に onCreate が呼び出されるのを防ぐことができます。

編集:

別の可能な解決策は、onCreate などでアプリケーションを実行している他のプロセスがあるかどうかを手動で確認することです。

    ActivityManager activityManager = (ActivityManager) this
            .getSystemService(ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> procInfos = activityManager
            .getRunningAppProcesses();
    int counter = 0;
    for (int i = 0; i < procInfos.size(); i++) {
        if (procInfos.get(i).processName.equals(this.getPackageName())) {
            counter++;
        }
        if (counter > 1) {
            // send broadcast to make other activities call finish() or the like
        }
    }

少しハックな感じがするので、この回答を投稿するのをためらっていますが、これまで他の提案が投稿されていないので、試してみてください.

起動後に電話がアプリを 2 回起動することがある別のシナリオで使用しました。このコードを使用すると、finish を呼び出すだけで 2 回目の開始が完了するのを防ぐことができます。

于 2013-09-23T21:33:05.723 に答える