背景
アプリを作る時にログを仕込んで、改善に役立てるのはよくあると思います。
アプリ起動時にログを送りたいということもよくあると思いますが、そのタイミングで詰まってしまったためまとめておきます。
今回想定するアプリ起動時
今回想定する アプリ起動時は以下のタイミングとします。
- ランチャーから立ち上げた時
- アプリ履歴(タスク)から立ち上げた時
一般的にはアプリ起動時にログを送る場合、Application#onCreate
でログを送ればいいと思いますが、今回はアプリ履歴から立ち上げた時にも送る必要があるのでこれだけは不十分です。
対応
-
Application.ActivityLifecycleCallbacks
を使用 -
ComponentCallbacks2#onTrimMemory
を使用 - 状態をフラグで管理
Application.ActivityLifecycleCallbacks
はその名の通りActivityのライフサイクルのコールバックを取れます。
ComponentCallbacks2#onTrimMemory
はAPIレベル14で追加されたものになります。OSがmemoryをtrimするすべきタイミングでこのメソッドが呼ばれます。アプリのが見えなくなった場合に引数のlevel
にComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN
が入ってきます。
これらを使って、UI_HIDDENのタイミングでログ送信フラグをtrueにして、Activityのいいタイミングでログを送って再びフラグをfalseにするだけです。以下コードを貼ります。
private boolean shouldSendLaunchLogs = true;
@Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
if (shouldSendLaunchLogs) {
// send logs
shouldSendLaunchLogs = false;
}
}
@Override public void onActivityStarted(Activity activity) {
if (shouldSendLaunchLogs) {
// send logs
shouldSendLaunchLogs = false;
}
}
@Override public void onActivityResumed(Activity activity) {
if (shouldSendLaunchLogs) {
// send logs
shouldSendLaunchLogs = false;
}
}
@Override public void onActivityPaused(Activity activity) {
if (shouldSendLaunchLogs) {
// send logs
shouldSendLaunchLogs = false;
}
}
@Override public void onActivityStopped(Activity activity) {
if (shouldSendLaunchLogs) {
// send logs
shouldSendLaunchLogs = false;
}
}
@Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
// no op
}
@Override public void onActivityDestroyed(Activity activity) {
// no op
}
@Override public void onTrimMemory(int level) {
if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
shouldSendLaunchLogs = true;
}
}
@Override public void onConfigurationChanged(Configuration newConfig) {
// no op
}
@Override public void onLowMemory() {
// no op
}
まとめ
今回はアプリ起動を判定するためにApplication.ActivityLifecycleCallbacks
とComponentCallbacks2
を使いました。
他の方法として、コールバックでActivityの数をカウントするなどの方法もあると思いますが、単純なロジックで実現できたためもし必要になれば使ってみてくださいm(_ _)m