Now in Android のインターネット接続まわりの調査
now in android はアプリがインターネットに接続してるかをどうやってチェックしているんだろうかと気になったので調査する。
どうやらisOffline
という変数でチェックしているように見える
Flowを使っている。
networkMonitor とはなんだろう
networkMonitor: NetworkMonitor
NetworkMonitor
はインターフェースだった。
どこに実装クラスがあるかも調べる
ConnectivityManagerNetworkMonitor.kt
だった。
isOnline
の実装を読み解く
callbackFlow{} の理解が浅いけど、コールバックAPIをFlowに変換することができるらしい。
40~45行目
まずApplicationContextからConnectivityManagerクラスを取得しようとしている。
ときにConnectivityManagerがnullとはどんな状況なのだろうか
ChatGPTいわく
- コンテキストが不適切な場合: context がアクティビティやサービスのコンテキストでない場合、システムサービスを取得できない可能性があります。たとえば、context が null である場合や、アプリケーションのライフサイクル中にコンテキストが失われる場合が考えられます。
- デバイスが不適切な構成を持つ場合: 一部のデバイスは、特定の機能を無効にしているか、サポートしていない場合があります。例えば、一部のエミュレーター設定では、ネットワーク接続をシミュレートする機能が無効になっている場合があります。
- デバイスのセキュリティ設定: ユーザーがデバイスのセキュリティ設定を変更して、特定のアプリケーションがネットワークにアクセスできないように制限している場合があります。このような制限は、Android のアプリケーション設定やデバイス管理ポリシーによって設定される場合があります。
- ランタイムパーミッションの不足: アプリケーションが必要なランタイムパーミッションを持っていない場合、システムサービスにアクセスできないことがあります。たとえば、ネットワークの状態を取得するためには、ACCESS_NETWORK_STATE パーミッションが必要です。パーミッションが不足している場合、getSystemService() は null を返す可能性があります。
デバイス側の問題が多そう?
51~64行目。Flowに変換するコールバック関数。
コメントを翻訳してみる
コールバックのメソッドは、アクティブなネットワークだけでなく、[NetworkRequest]にマッチするすべてのネットワークの変更時に呼び出される。したがって、単純にそのような[Network]の存在(または不在)を追跡することができる。
NetworkRequestっていうのは使用可能な範囲にあるネットワークの探索ってことだろうか。
NetworkCallbackコールバックで新しくネットワークが追加されたり消えたりするのを追跡できるってことだと思う
66~68行目NetworkRequestクラスを生成している。
NetworkRequestはざっくりいうとアプリが特定のネットワークを要求または監視するためのオブジェクトのこと。
addCapability
で要求するネットワークの属性を与える。
機能はNetworkCapabilitiesから選択することができて、
NetworkCapabilities.NET_CAPABILITY_INTERNET
は単に一般のインターネットに到達できることを示す。他にもいろいろな種類があるっぽい
69~79行目val request
) を満たすすべてのネットワークに関する通知を受け取るためにあらかじめ定義しておいたコールバック(val callback
)を登録している
79行目ではインターネットにつながっている限りtrueをチャンネルへ送信している
awaitClose
はFlow Channelがクローズまたはキャンセルされるまで処理をブロックする。
注: 同時に登録できるコールバックの数には上限があります。不要になったコールバックは登録を解除して、アプリでさらに登録できるようにします。
この理由からawaitClose
ブロック内で同時にcallback
を解除している
最初に戻ってisOfflineが使われている箇所はここ
isOfflineがtrueならば警告のスナックバーを表示させている
なんかConnectivityManagerNetworkMonitor内で定義している変数がisOnlineなのに実際に使っているのはisOfflineだからちょっと違和感ある