Android Kotlin基礎講座 04.1: ライフサイクルとログ情報について

Android Kotlin基礎講座

タスク:ログ用にTimberを使う

このタスクではログ用ライブラリとして有名なTimmerを使うようにアプリを修正していきます。TimberにはAndroidの組み込みのLogクラスを利用する上でいくつかの利点があります。

  • クラス名に基づいたログタグを作成してくれる。
  • リリース用のアプリでログを表示しないようにしてくれる。
  • クラッシュレポートライブラリとの統合を可能にしてくれる。

一つ目の利点についてはすぐにこの後のステップで目にすることになります。その他についてはより大きなアプリを開発する際に恩恵を感じられると思います。

ステップ1:GradleにTimberを追加する

  1. GitHubのTimber projectに飛んでください。Downloadの下にあるimplementationから始まるコードをコピーしてください。コードは以下のようになりますが、バージョンを表す数値はその時々で異なります。
implementation 'com.jakewharton.timber:timber:4.7.1'
  1. Android StudioのプロジェクトパネルのGradle Scriptsフォルダを展開してbuild.gradle(Module: app)を開いてください。
  2. dependenciesセクションの中に先ほどコピーしたコードを張り付けてください。
dependencies {
   ...
   implementation 'com.jakewharton.timber:timber:4.7.1'
}
  1. 右上に表示されるSync NowをクリックしてGradleをリビルドしてください。

ステップ2:Applicationクラスの作成とTimberの初期化

このステップではApplicationクラスを作成します。Applicationはアプリ全体のグローバルなアプリケーション状態を表す基底クラスになります。またOSがアプリと対話するためのメインオブジェクトでもあります。ApplicationクラスはAndroidシステムがデフォルトで使っているものがもともとあり、アプリに使われるApplicationオブジェクトも既に作られています。何も特定しない場合は自分で作る必要はありません。

アプリ全体がTimberというログライブラリを使うことになるので、TimberはApplicationクラスを使います。このライブラリは最初に一度初期化される必要があります。今回のような場合はApplicationクラスのサブクラスを作り、独自のカスタマイズを実装してデフォルトのものをオーバーライドできます。

警告: Applicationクラスは全てのアクティビティより先に作られ、グローバルな状態を保持できるので、自身のコードをApplicationクラスに追加したいと考えられるかもしません。しかしグローバルに取得可能で、読み書きできる静的変数を作るのはエラーの原因になりますし、Applicationクラスを乱用しがちになります。本当に必要でない場合を除き、Applicationクラスにアクティビティコードを置くのは避けましょう。

Applicationクラスを作成した後はAndroidマニフェストにそのクラスを指定する必要があります。

  1. dessertclickerパッケージ中で、ClickerApplicationという新規Kotlinクラスを作成します。app > javaのcom.example.android.desserclicker上で右クリックし、New > Kotlinf File/Classを選択してください。
  2. ClickerApplicationと名前を付け、Classをダブルクリックしてください。

Android Studioが新しくClickerApplicationクラスを作成してくれます。クラスコードは以下のようになっているはずです。

package com.example.android.dessertclicker

class ClickerApplication {
}
  1. Applicationのサブクラスになるようにクラス定義を変更し、必要であればApplicationクラスをインポートしてください。
class ClickerApplication : Application() {
  1. onCreate()メソッドをオーバーライドするために、Code > Override Methodsを選択するかControl+oを押してください。
class ClickerApplication : Application() {
   override fun onCreate() {
       super.onCreate()
   }
}
  1. onCreate()メソッドの中でTimberライブラリを初期化します。
override fun onCreate() {
    super.onCreate()

    Timber.plant(Timber.DebugTree())
}

このコードはアプリ用のTimberライブラリを初期化し、アクティビティの中でライブラリを使えるようにします。

  1. AndroidManifest.xmlを開いてください。
  2. <application>要素の一番上にClickerApplication用の新しい属性を追加します。そうすることでAndroidシステムがデフォルトのApplicationクラスの代わりにこのクラスを使うということを知ることができます。
<application
   android:name=".ClickerApplication"
...

Note: 自分で作成したApplicationクラスをマニフェストに追加しなくてもアプリはエラー無く動作します。しかしその場合、アプリは独自のクラスを利用しないので、Timberからのログ情報は一切表示されません。

ステップ3:Timberログ文を追加する

このステップではLog.i()をTimberを使うように変更していきます。そして他の全てのライフサイクルメソッド用にロギングを実装していきます。

  1. MainActivityを開いてonCreate()の箇所までスクロールしてください。Log.i()をTimber.i()で置き換えて、ログタグは削除してください。
Timber.i("onCreate called")

LogクラスのようにTimberも何かしらの情報用メッセージにはi()メソッドを用います。
Timberの場合はログタグを追加する必要はないことに気を付けてください。Timberは自動でクラス名をログタグに設定してくれます。

  1. 同様に、onStart()内のLogも変更してください。
override fun onStart() {
   super.onStart()

   Timber.i("onStart Called")
}
  1. コンパイルしてアプリを起動し、Logcatを開いてください。以前と同じログメッセージが表示されているかと思います。これらはLogクラスではなくTimberによって生成されたログになります。
  2. MainActivityの残りのライフサイクルメソッドもオーバーライドしてください。そしてTimberログ文を追加してください。以下のようになります。
override fun onResume() {
   super.onResume()
   Timber.i("onResume Called")
}

override fun onPause() {
   super.onPause()
   Timber.i("onPause Called")
}

override fun onStop() {
   super.onStop()
   Timber.i("onStop Called")
}

override fun onDestroy() {
   super.onDestroy()
   Timber.i("onDestroy Called")
}

override fun onRestart() {
   super.onRestart()
   Timber.i("onRestart Called")
}
  1. コンパイルしてもう一度アプリを起動してください。Logcatを見てください。今回はonCreate()とonStart()に加えて、onResume()ライフサイクルコールバック用のログが表示されているはずです。

アクティビティをスクラッチから始めた場合、これら三つのライフサイクルコールバックが順番に呼び出されます。

  • アプリを作成するためのonCreate()
  • アプリを起動し画面上で見えるようにするためのonStart()
  • アクティビティにフォーカスを当て、ユーザーがアプリと対話できるようにするためのonResume()

その名前にも関わらず、resume(再開)するものがなくてもonResume()メソッドはスタートアップ時に呼び出されます。

コメント

プロフィール

プロフィール
コードラボJP

大学卒業後SEに就職、現在は退職しフリーランスとして活動中。
『初心者でも挫折せずに一人でプログラミングを学べる』をモットーに、コードラボJPを開設
お問い合わせ等はcodelabsjp@gmail.comまで

コードラボJPをフォローする
タイトルとURLをコピーしました