2017-09-19 10 views
0

アクティビティが開始される前にすべてのアクティビティが停止する前にスクリプトを実行したい場合は、どこでこのようなリスナをアンドロイドに入れますか?すべてのアクティビティの開始前および終了後のリスナー?

アイブ氏は、Android Applicationクラスにそれを置く考えられ、単にそのonCreateonSaveInstanceState内のメソッドを置く - が、私はわからない、彼らはすべてのactivites

+3

それはあなたが[XY問題の犠牲に落下していないことを確認するために、あなたはこの動作をする理由* *記述することが最善です](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - あなたが望む行動を達成するための、より簡単で効率的な方法があるかもしれません。 –

+0

@VinceEmigh私は複数のモデル 'User'、' Comment'、 'Post'を操作しています。これらはすべて、単純な自動インクリメントロングIDといくつかのプリミティブ属性(int age、String text)を含んでいます。 私はそれらにアクセスする複数のアクティビティ(ビュープロファイルアクティビティとプロファイルアクティビティの変更)を持っているので、必要なすべてのモデルをいくつかの静的クラスまたは変更された 'Application'クラスにロードするために、オーバーラーニングクラスを作成したかったのです。実行時には、すべてのアクティビティがそのクラスからこれらのオブジェクトを操作するだけで、誰もが同期して、コストのかかるIOを回避できます。そして、アクティビティがすべて終了すると、 – AlanSTACK

+0

がロードされます。ロード時には、ロードオンデマンドを実装し、アンドロイドはonPause/onDestroyメソッドが常に呼び出され、データにつながるので、損失。 – k3b

答えて

1

残念ながら、Applicationクラスではありませんがあり前後に呼び出されますここ

< <は、古いコードだった>>更新

:0123をアプリケーションが停止しているが、私はこのコードを試すことができると思いコールバックApplicationクラスのコード:

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     startService(new Intent(this, Monitor.class)); 
    } 
} 

バックグラウンドサービスのコード:

public class Monitor extends Service implements Application.ActivityLifecycleCallbacks { 

    private static final String TAG = "Monitor"; 

    int mActivitiesCount = 1; // At the moment when service started, the main Activity is already opened 

    public Monitor() { 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     getApplication().registerActivityLifecycleCallbacks(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     getApplication().unregisterActivityLifecycleCallbacks(this); 
     super.onDestroy(); 
    } 

    @Override 
    public void onActivityCreated(Activity activity, Bundle bundle) { 
     mActivitiesCount++; 
     Log.d(TAG, "onActivityCreated: count: " + mActivitiesCount); 
    } 

    @Override 
    public void onActivityStarted(Activity activity) { 

    } 

    @Override 
    public void onActivityResumed(Activity activity) { 

    } 

    @Override 
    public void onActivityPaused(Activity activity) { 

    } 

    @Override 
    public void onActivityStopped(Activity activity) { 

    } 

    @Override 
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { 

    } 

    @Override 
    public void onActivityDestroyed(Activity activity) { 
     mActivitiesCount--; 
     Log.d(TAG, "onActivityDestroyed: count: " + mActivitiesCount); 
     if (mActivitiesCount == 0) { 
      Log.d(TAG, "All activities was destroyed"); 
      // do something 
     } 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 
+0

私はそれをテストしましたが、HashSetが 'onCreate 'の間にリセットされるので、これはうまくいかず、再び正方形に戻ります。あなたのソリューションは、アプリケーションがすべてのアクティビティを過ぎても存続し、それらの前で死ぬことがない場合に動作します。 – AlanSTACK

+0

@Alan、アプリケーションのonCreate()メソッドで空の "STICKY"バックグラウンドサービスを開始し、すべてのアクティビティが破棄されたときに停止します。これにより、実行中のアクティビティがなくてもアプリケーションを存続させることができます。 – fishbone

+0

例/擬似コード/そのようなことを行う方法に関するいくつかのリンクを用意して、あなたの回答を回答として受け入れることができますか? – AlanSTACK

関連する問題