0

System.exit(0)アプリの起動時にアクティビティがすぐに終了するという問題が発生しました。

プロジェクトでは、アプリの完全な終了を実現するために使用していることがわかりますSystem.exit(0)が、それを行いますが、アクティビティはプロジェクトでライフサイクルを通過しなかったため、次の方法を使用します:

public class App extends Application {
    private int mLock = 0;
    @Override
    public void onCreate() {
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                mLock++;
            }
            @Override
            public void onActivityDestroyed(Activity activity) {
                try {
                    //Simulation Activity Destroyed too time consuming and increase the probability of problems

                    Thread.sleep(300);
                } catch (InterruptedException e) {
                }
                mLock--;
                if(mLock<=0){
                    exit();
                }
            }
            @Override
            public void onActivityStopped(Activity activity) {}
            @Override
            public void onActivityStarted(Activity activity) {}
            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
            @Override
            public void onActivityResumed(Activity activity) {}
            @Override
            public void onActivityPaused(Activity activity) {}

        });
    }

    public void exit() {
        System.exit(0);
    }

}

しかし、そのような問題が発生します。最後のアクティビティを終了し(アプリを終了)、すぐにアプリを開始すると、アクティビティは終了しましたが、完全に開始されませんでした(フラッシュ終了)。

がやりたいことは、すべてのアクティビティが破棄されたときにアプリを終了することですが、問題があります。() を終了し、アクティビティを開始し、System.exit() を呼び出します。この時点でフラッシュ終了が発生します。この問題を回避するにはどうすればよいですか?</p>

さて、私の目的は、この操作プロセスの終了を行う他のアクティビティではなく、デフォルトのスタートアップ アクティビティの破棄の直後に、アプリケーション プロセスを終了することです (いくつかの必要性はありますが、そうすべきであるとは考えていません)。上記の方法を使用して、すべての開始アクティビティがアプリでライフサイクルを完了できるようにします。しかし、それには説明として問題がありました。これはマルチスレッド同期の問題であるはずですが、アプリケーションでスリープしています。なぜスリープ中にアクティビティを作成できるのでしょうか? アプリケーションとアクティビティは同じスレッドではありませんが、スレッド ID は 1 です。

4

2 に答える 2

5

System.exit(0)は絶対に使用しないでください。これは、Androidのコーディング慣行に反します。それはあなたが望むものではないアプリをすぐに終了するように設計されています。ユーザーが「ホーム」または「戻る」を押すと、アクティビティがスタックからポップされ、それらすべてのライフサイクルメソッドが呼び出されます。finish()別の方法は、アプリを途中で終了する理由がある場合にこの方法を使用することです。

于 2013-02-21T03:09:49.167 に答える
1

あなたに知らせるためだけに。またはAndroidアプリを強制終了してActivityも、そのライフサイクルメソッドを特別に呼び出し続けることはありませんonDestroy()finish()代わりに使用してください

void exit()
{

    finish();

}

本当にAndroidアプリを終了したい場合は、すべてのアクティビティ、サービス、BroadcastReceiversを閉じてください。Androidシステムはプロセスを強制終了する権利を有します。

于 2013-02-21T03:09:36.100 に答える