&autolink(id=main)
目次
参考にするリンク
- Application.ActivityLifecycleCallbacks
- http://developer.android.com/reference/android/app/Application.ActivityLifecycleCallbacks.html
ActivityLifecycleCallbacksを使う。
API-14 で ActivityのLifecycleを通知してくれる仕組みが公式に入った。
ActivityLifecycleCallbacks
これを使ってActivityのスタックを監視してみる。
ActivityLifecycleCallbacksを登録する。
使い方は、
- ActivityLifecycleCallbacksを実装したクラスを
- Application#registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks)で登録
するだけ。
public class TestApplication extends Application implements ActivityLifecycleCallbacks {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(this);
}
// ================================================================
// ActivityLifecycleCallbacksのメソッド郡
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
public void onActivityPaused(Activity activity) {
}
public void onActivityDestroyed(Activity activity) {
}
public void onActivityStarted(Activity activity) {
}
public void onActivityResumed(Activity activity) {
}
public void onActivityStopped(Activity activity) {
}
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
}
ActivityLifecycleCallbacksで監視する。
基本的にActivityLifecycleCallbacksは、
各Activityの処理よりも先行して処理を書くのではなくて
後々利いてくる処理を書いておいたり、
スタックを気にする処理を書いておくのがいいと思う。
ただ、これはあくまでLifecycleを拾えるだけで、必ずしも予想通りに動作するとは限らない。
フレームワークに手を入れられている場合はLifecycle無視で処理されることもあり、
信じてもよさそうなのは onCreate と onPause だけ。
あとは Intent.FLAG_ACTIVITY_CLEAR_TOP で唯一動作する onDestroy で
onPause で書いた終了処理と同じ構成を作っておくくらいか。。。
ActivityLifecycleCallbacksを眺める。
さて、ActivityLifecycleCallbacksのコールバックメソッド郡は、
名前の通り 各対応メソッドが呼ばれた後に コールバックされる。
onActivityCreated なら onCreate の後にコールバック
といった具合。
ただこのタイミングが、通常は実処理より早い。
ActivityLifecycleCallbacksのコールバック処理は、
Applicationのソースにコールバックを行う処理が入っている。
- dispatchActivityCreated(Activity, Bundle)
- dispatchActivityStarted(Activity)
- dispatchActivityResumed(Activity)
- dispatchActivityPaused(Activity)
- dispatchActivityStopped(Activity)
- dispatchActivitySaveInstanceState(Activity, Bundle)
- dispatchActivityDestroyed(Activity)
で、このコールバックがいつ呼ばれるのかというと、Activity#onCreate()などである。
public class Activity extends ContextThemeWrapper
implements LayoutInflater.Factory2,
OnCreateContextMenuListener, ComponentCallbacks2 {
protected void onCreate(Bundle savedInstanceState) {
if (mLastNonConfigurationInstances != null) {
mAllLoaderManagers = mLastNonConfigurationInstances.loaders;
}
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
mFragments.dispatchCreate();
getApplication().dispatchActivityCreated(this, savedInstanceState);
mCalled = true;
}
}
つまり、普段書くような以下のようなActivityの場合は、
- super.onCreate(savedInstanceState);
で
- dispatchActivityCreated(Activity, Bundle)
が動作してから処理部にくる。
public class HomeActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 何らかの処理
}
}
なお、元々処理があんまり入ってない onPause や onStop はいいとして、
onDestroy も同様に最後にコールバックされるので注意。
protected void onDestroy() {
mCalled = true;
// dismiss any dialogs we are managing.
if (mManagedDialogs != null) {
final int numDialogs = mManagedDialogs.size();
for (int i = 0; i < numDialogs; i++) {
final ManagedDialog md = mManagedDialogs.valueAt(i);
if (md.mDialog.isShowing()) {
md.mDialog.dismiss();
}
}
mManagedDialogs = null;
}
// close any cursors we are managing.
synchronized (mManagedCursors) {
int numCursors = mManagedCursors.size();
for (int i = 0; i < numCursors; i++) {
ManagedCursor c = mManagedCursors.get(i);
if (c != null) {
c.mCursor.close();
}
}
mManagedCursors.clear();
}
// Close any open search dialog
if (mSearchManager != null) {
mSearchManager.stopSearch();
}
getApplication().dispatchActivityDestroyed(this);
}
onPause は特にANRのタイムアウトがあるので、
どちらにしたところで重い処理はやらない方がいい。
この辺が監視処理だけに留めた方がよい理由でもある。
まとめ
Application.registerActivityLifecycleCallbacks() で
ActivityLifecycleCallbacks を実装したクラスを登録すると、
各種Activityのコールバックを受けられる。
ただし、Activity#onCreate()などの処理の中で呼ばれるので、
- 実処理よりも早い段階でコールバックが呼ばれたり、
- 重い処理を行うとANRが発生したり、
する。
全体のスタック監視や、どうしても管理が必要な場合のみに
使用を留めるべき。
関連リンク
取得中です。
&trackback()
最終更新:2012年02月12日 20:26