Android Architecture Components(AAC)を勉強がてら触ってみて、便利だなぁと思ったので投稿したいと思います。
煩雑になってしまう広告SDKの組み込み
アプリエンジニアとして誰しも広告SDKの組み込みは、一度や二度経験したことがあるかと思います。
広告SDKによって組み込み方法(コードの実装の仕方)は色々ありますが、下記のように Activity(やFragment)のライフサイクルに合わせて メソッドを呼び出す必要があるものもあったりします。
class MainActivity : AppCompatActivity() {
private val adView by lazy { findViewById<AdView>(R.id.adView) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adView.create() // 広告生成
}
override fun onResume() {
super.onResume()
adView.resume() // 広告読み込み再開
}
override fun onPause() {
super.onPause()
adView.pause() // 広告読み込み停止
}
override fun onDestroy() {
super.onDestroy()
adView.destroy() // 広告破棄
}
}
上記の場合サンプルコードですので見通しがいいですが、プロダクトで使っているFatなActivityに実装する場合だと他の処理などがあるので、結構な辛みがありますよね。
また、複数の広告SDKを入れ込む必要とかも場合によっては出てくるので、そうなるとどんどんと複雑度が増してしまいます。
override fun onResume() {
super.onResume()
adView.resume() // 広告読み込み再開
adView2.resume() // 広告2読み込み再開
}
この、ライフサイクルに対応して処理を行う、ということを実現するがためにActivityやFragmentが煩雑になってしまうのは、どうにか出来ないのか…
はい、そんなときにAACのLifecycleを使うといいかもしれないですね。
Lifecycle
すべての Android デベロッパーは、Activity を起動、停止、破棄するオペレーティング システムに対応しなければなりません。具体的には、ライフサイクルに応じて、UI の更新に使う監視可能オブジェクトなどのコンポーネントの状態を管理する必要があります。Lifecycle は、 ライフサイクル対応コンポーネント の作成を可能にするもので、自身のライフサイクルを管理してリークやクラッシュの可能性を減らすことができます。Lifecycle ライブラリは、LiveData などの他の Architecture Components の基礎となっています。
まぁ、ライフサイクル対応のコンポーネントを作成出来る、ということですね。
説明に関しては、https://developer.android.com/topic/libraries/architecture/lifecycle.html がわかりやすいです。
スッキリさせてみる
AdView
をラップする感じで AdManager
というクラスを作成し、そのクラスに LifecycleObserver
というLifecycleが提供しているマーカーインターフェースを実装させてみます。
準備は以上で、あとはonCreate時に実行させたいメソッドに @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
という風にアノテーションを付与します。
class AdManager(private val adView: AdView) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun create() {
adView.create()
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resume() {
adView.resume()
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pause() {
adView.pause()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun destroy() {
adView.destroy()
}
}
Activity側では、 lifecycle.addObserver
でObserverを追加します。そうすることにより、そのActivityのライフサイクルがObserverに伝わる、みたいな感じですかね。
最終的にはActivityは下記のようになりました。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val adView = findViewById<AdView>(R.id.adView)
lifecycle.addObserver(AdManager(adView))
}
}
スッキリ!
まず、 onResume
onPause
などの処理が AdManager
に移ったので見通しが良くなりました。広告SDKの処理に関しても、 AdManager
に閉じ込めることが出来たので、そこだけに集中すればよくなりました。
また、 前のコードでは adView
というインスタンス変数がありましたが、それをローカル変数で使うように出来たので、関心事も減りました。(インスタンス変数は少ないほうがいいですよね。)
AACのLifecycle、便利である。
まとめ
煩雑になってしまう広告SDKの組み込みを、AACのLifecycleを使用することでスッキリ書けるのでは?、ということを記載しました。
今回は広告SDKの組み込みに関してでしたが、Lifecycleは他にも使いみちはたくさんありそうなので、効果的に使えればかなり便利だと思いました。