データベース シングルトンがあり、アプリの終了時に .close() を呼び出したいと考えています。
Application クラスの onCreate() でデータベースに対して .open() を呼び出すことはできますが、どこで .close() を呼び出すのでしょうか?
ええ、私がしているのは、フォアグラウンド アクティビティを探すようなものです。各フォアグラウンド アクティビティが停止した後、デクリメントできます。ゼロに到達し、妥当な時間そこにとどまると、そのようなリソースを安全に閉鎖できることがわかります。この方法で、アプリで仮想ライフサイクル コールバックを作成することになりました。したがって、この方法は、タスクの数や開始点に関係なく機能します。アプリを 1 か所からしか実行および開始できず、すべてが 1 つの直線的な方法でのみ進行する場合は、はい、ルート アクティビティ アプローチも機能します。
具体的には次のようにします。
ベースアクティビティ
public class BaseActivity extends Activity {
public void onResume() {
MyBaseApplicationType app = (MyBaseApplicationType)getApplicationContext();
app.incrementForegroundActivity();
}
public void onPause() {
MyBaseApplicationType app = (MyBaseApplicationType)getApplicationContext();
app.decrementForegroundActivity();
}
}
MyBaseApplication
public class MyBaseApplication extends Application {
private int mForegroundActivities;
private Handler mHandler;
public void onCreate() {
mHandler = new Handler();
}
public void decrementForegroundActivity() {
mForegroundActivities--;
if (mForegroundActivities == 0) {
mHandler.postDelayed(mRunnable, 1000 /*about a second*/);
}
}
public void incrementForegroundActivities() {
mForegroundActivities++;
}
private Runnable mRunnable = new Runnable() {
public void run() {
if (mForegroundActivities == 0) {
// Listeners of this broadcast can then clean up anything
// as needed.
Intent intent = new Intent("com.my.package.ACTION_BACKGROUNDED");
sendBroadcast(intent);
}
}
};
}
onDestroy()
通常、またはでデータベース接続を閉じる必要がありますonStop()
。onDestroy()
アクティビティがメモリから削除されて破棄される直前に呼び出されます。onStop()
別のアプリケーションに移動すると呼び出されます。どちらでも機能しますが、アプリの切り替えが遅くなるonDestroy()
ため、一般的には優れています。onStop()
詳細: http://developer.android.com/training/basics/activity-lifecycle/starting.html