26
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Androidアプリにおける起動を判定する必要があったのでシンプルに実装してみた

Posted at

背景

アプリを作る時にログを仕込んで、改善に役立てるのはよくあると思います。
アプリ起動時にログを送りたいということもよくあると思いますが、そのタイミングで詰まってしまったためまとめておきます。

今回想定するアプリ起動時

今回想定する アプリ起動時は以下のタイミングとします。

  • ランチャーから立ち上げた時
  • アプリ履歴(タスク)から立ち上げた時

一般的にはアプリ起動時にログを送る場合、Application#onCreateでログを送ればいいと思いますが、今回はアプリ履歴から立ち上げた時にも送る必要があるのでこれだけは不十分です。

対応

  1. Application.ActivityLifecycleCallbacksを使用
  2. ComponentCallbacks2#onTrimMemoryを使用
  3. 状態をフラグで管理

Application.ActivityLifecycleCallbacksはその名の通りActivityのライフサイクルのコールバックを取れます。
ComponentCallbacks2#onTrimMemoryはAPIレベル14で追加されたものになります。OSがmemoryをtrimするすべきタイミングでこのメソッドが呼ばれます。アプリのが見えなくなった場合に引数のlevelComponentCallbacks2.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.ActivityLifecycleCallbacksComponentCallbacks2を使いました。
他の方法として、コールバックでActivityの数をカウントするなどの方法もあると思いますが、単純なロジックで実現できたためもし必要になれば使ってみてくださいm(_ _)m

26
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?