煩雑になってしまう広告SDKの組み込みは、AACのLifecycleを使うとスッキリするかもしれない

Android Architecture Components（AAC）を勉強がてら触ってみて、便利だなぁと思ったので投稿したいと思います。

# 煩雑になってしまう広告SDKの組み込み
アプリエンジニアとして誰しも広告SDKの組み込みは、一度や二度経験したことがあるかと思います。

広告SDKによって組み込み方法（コードの実装の仕方）は色々ありますが、下記のように **Activity（やFragment）のライフサイクルに合わせて** メソッドを呼び出す必要があるものもあったりします。

```kotlin:MainActivity.kt

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を入れ込む必要とかも場合によっては出てくるので、そうなるとどんどんと複雑度が増してしまいます。

```kotlin
override fun onResume() {
    super.onResume()
    adView.resume() // 広告読み込み再開
    adView2.resume() // 広告2読み込み再開
}
```

この、**ライフサイクルに対応して処理を行う**、ということを実現するがためにActivityやFragmentが煩雑になってしまうのは、どうにか出来ないのか…  
  
  
  
**はい、そんなときにAACのLifecycleを使うといいかもしれないですね。**

# Lifecycle
https://developers-jp.googleblog.com/2017/11/announcing-architecture-components-10.html

>すべての 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)` という風にアノテーションを付与します。

```kotlin:AdManager.kt

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は下記のようになりました。

```kotlin:
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は他にも使いみちはたくさんありそうなので、効果的に使えればかなり便利だと思いました。