web-dev-qa-db-ja.com

Android:onDestroy()またはApplicationクラスの同様のメソッド

コンテキストを必要とするいくつかのグローバル変数で動作するようにApplicationクラスを拡張しています。 Applicationクラスには、アクティビティの他のonCreate()の前に呼び出されるonCreate()メソッドがありますが、onDestroy()または同様のメソッドがApplicationクラスにあるかどうかを知りたいオーバーライド永続メモリに変数を保存し、リスナーを登録解除し、アプリプロセスが強制終了される前に最後のメッセージをサーバーに送信できるようにするには?そうでない場合、それを行う他の方法はありますか?

65
Maybe Julius

Applicationクラスの実稼働デバイスには、このようなコールバックはありません。

あなたがしたいことは通常、変更が行われた直後、またはそれぞれのアプリコンポーネントのonPause()で行われるべきです。

29
Raghav Sood

Androidには、アプリを閉じるという概念はありません。ユーザーはただ去ります:これはあなたが気づく唯一のイベントです(アクティビティのonPause())。このライフサイクルに合わせてアプリの設計を調整する必要があります。

回避策を見つけようとしないでください。事態を悪化させる可能性があります。ユーザーがバッテリーを使い果たした場合や、アプリがクラッシュした場合はどうでしょうか。すべてのデータが失われます。使用しているデータの種類はわかりませんが、通常、Google Playでの評価は低くなります。何か悪いことが起こったとしても、すべてのデータはすでに保存されているはずです(AsyncTasksはこれに最適です。データを絶えず保存するために、変更のたびにデータを開始することを恐れないでください)。

6
Dalmas

まず第一に:私は絶対に初心者です

アプリの終了時にコードを実行する必要があります(はい、Androidでそのようなことはわかっていません)。

-アプリケーションを拡張するMyApplicationがあります。 MyApplicationのメンバーとして、activeActivitiesNumberというAtomicIntegerフィールドとパブリックgetterメソッドがあります。

-すべてのアプリケーションアクティビティがMyActivyを拡張します(それ自体がアクティビティを拡張します)

-MyActivityは、onCreate、onResume、およびonStopメソッドをオーバーライドし、保護フィールドも持っています:Protected MyAppication mAppState;

a) OnCreate(){
super.onCreate();
mAppState=this.getApplication();...}


b) onResume(){
super.OnResume();
myAppState.getactiveActivitiesNumber().addAndGet(1)
....}

c) onStop(){
super.onStop()

if (myAppStatemyAppState.getactiveActivitiesNumber()..decrementAndGet()<1){
...call exiting code (for instance a public method defined in MyApplication}
}

これには問題があります:アクティビティtanがアプリケーションに属していないアクティビティを開始すると(たとえば、メールを送信するなど)、終了メソッドが起動されます。

別の問題(それが理論上のものかどうか分からない)は、onStopが呼び出される状況によっては日焼けが保証されないことです。

この助けを願っています。

4

ApplicationクラスでregisterActivityLifecycleCallbacks()を次のコールバックで使用できます(AppLifecycleCallbacksを拡張するActivityLifecycleCallbacksクラスを作成することをお勧めします)。

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}
1
box

アプリで最後に閉じられるActivityonDestroy()をオーバーライドして、終了するかどうかを確認できます。この場合、デバイスの回転時にコードは呼び出されません。ただし、デバイスのホームボタンを使用してアプリを閉じても、onDestroy()は呼び出されないことに注意してください。

@Override
public void onDestroy(){
    super.onDestroy();
    if(isFinishing()){
        //do your stuff here
    }
}
1
dzikovskyy