7
1

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.

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

Posted at

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

煩雑になってしまう広告SDKの組み込み

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

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

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

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

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

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

7
1
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
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?