1

私は、サードパーティのアプリケーションで使用されるいくつかの機能を持つアンドロイドライブラリを構築しています。私のライブラリでは、ネットワーク関連のものにアクセスする必要があり、ConnectivityManagerを取得するためにContext.getSystemService()にアクセスする必要があります。例えば、 -アクティビティやコンテキストを持たないライブラリ内のConnectivityManagerへのアクセス

ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));

問題は、私はからコンテキストを取得するには、アクティビティクラスを持っていないということです。したがって、2つの質問 -

  1. 私のライブラリメソッドが呼び出されたアクティビティのコンテキストを取得する方法はありますか?
  2. アプリのアクティビティコンテキストを第三者のライブラリに渡すようにアプリケーション(私のライブラリを呼び出す)に依頼するのがよい方法ですか?

ありがとう!

+0

コンストラクタまたはメソッドのパラメータに 'context'を渡します。 –

+0

必ずしもアクティビティである必要はありません。アプリケーションコンテキストでも渡すことができます。アプリケーションコンテキストを使用している場合は、ライブラリの初期化中にSOがある可能性があります。 – ifiok

+0

difyzz - 呼び出し元のアプリケーションから継承する必要がありますか?それとも私はクラスそのものの中でそれを得ることができますか? – snakepitbean

答えて

1

理想的には、リソースを取得するためにコンテキストを渡すべきではありません。リソース自体(この場合はConnectivityManager)を渡す必要があります。それは実用的ではない(いくつかのリソースが必要な場合、またはそれらをリロードする必要があるため)、またはリソース自体がContextのライフサイクルに縛られ、アプリケーションコンテキストが役に立たない場合、コンテキストを渡す必要があります必要に応じて参照を消去できるようにして、リークやクラッシュを避けることができます。たとえば、setContext(コンテキストコンテキスト)メソッドを追加し、アクティビティを終了するときにコンテキストをnullに設定します。ちょうどきれいではありませんが、あなたがユーザーの行動を制御しないという事実を考えれば、最も安全な賭けです。同様のオプションは、ライブラリオブジェクトの参照を削除することですが、ライブラリがGCの次のスイープまでコンテキストで何らかの操作を行うことはありません。 ライブラリがメインスレッドで動作していても、アプリはいつでもバックグラウンドに送信できます。

関連する問題