アクティビティが開始される前にすべてのアクティビティが停止する前にスクリプトを実行したい場合は、どこでこのようなリスナをアンドロイドに入れますか?すべてのアクティビティの開始前および終了後のリスナー?
アイブ氏は、Android Application
クラスにそれを置く考えられ、単にそのonCreate
とonSaveInstanceState
内のメソッドを置く - が、私はわからない、彼らはすべてのactivites
アクティビティが開始される前にすべてのアクティビティが停止する前にスクリプトを実行したい場合は、どこでこのようなリスナをアンドロイドに入れますか?すべてのアクティビティの開始前および終了後のリスナー?
アイブ氏は、Android Application
クラスにそれを置く考えられ、単にそのonCreate
とonSaveInstanceState
内のメソッドを置く - が、私はわからない、彼らはすべてのactivites
残念ながら、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;
}
}
私はそれをテストしましたが、HashSetが 'onCreate 'の間にリセットされるので、これはうまくいかず、再び正方形に戻ります。あなたのソリューションは、アプリケーションがすべてのアクティビティを過ぎても存続し、それらの前で死ぬことがない場合に動作します。 – AlanSTACK
@Alan、アプリケーションのonCreate()メソッドで空の "STICKY"バックグラウンドサービスを開始し、すべてのアクティビティが破棄されたときに停止します。これにより、実行中のアクティビティがなくてもアプリケーションを存続させることができます。 – fishbone
例/擬似コード/そのようなことを行う方法に関するいくつかのリンクを用意して、あなたの回答を回答として受け入れることができますか? – AlanSTACK
それはあなたが[XY問題の犠牲に落下していないことを確認するために、あなたはこの動作をする理由* *記述することが最善です](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - あなたが望む行動を達成するための、より簡単で効率的な方法があるかもしれません。 –
@VinceEmigh私は複数のモデル 'User'、' Comment'、 'Post'を操作しています。これらはすべて、単純な自動インクリメントロングIDといくつかのプリミティブ属性(int age、String text)を含んでいます。 私はそれらにアクセスする複数のアクティビティ(ビュープロファイルアクティビティとプロファイルアクティビティの変更)を持っているので、必要なすべてのモデルをいくつかの静的クラスまたは変更された 'Application'クラスにロードするために、オーバーラーニングクラスを作成したかったのです。実行時には、すべてのアクティビティがそのクラスからこれらのオブジェクトを操作するだけで、誰もが同期して、コストのかかるIOを回避できます。そして、アクティビティがすべて終了すると、 – AlanSTACK
がロードされます。ロード時には、ロードオンデマンドを実装し、アンドロイドはonPause/onDestroyメソッドが常に呼び出され、データにつながるので、損失。 – k3b