質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

861閲覧

Wi-Fi接続確立のイベントについて

ms90

総合スコア39

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

1グッド

0クリップ

投稿2019/02/21 02:26

<やりたいこと>
アクセスポイントへの接続が確立した際のイベントで処理を実行したい。できればBroadcastReceiverでやりたい。

<困っていること>
下記コードで実装しているが、接続確立したイベント(NetworkInfo.State.CONNECTED)を二度受け取ってしまう。
結果レシーバー内の「★印」の箇所が二度走る。
これはAndroidの仕様であるのか、BroadcastReceiverに指定しているイベントが違うのか知りたい。

接続が確立した際にはCONNECEDは一度だけ渡ってくるイメージなのですが、想定の動作をしてくれません。
android.net.wifi.STATE_CHANGE ではない正しいイベントをご存知の方、コードの間違いに気づかれた方はどうかご助力願えないでしょうか。

xml

1// AndroidManifest 2 3<receiver android:name=".StateChanageReceiver"> 4 <intent-filter> 5 <action android:name="android.net.wifi.STATE_CHANGE" /> 6 </intent-filter> 7</receiver> 8

java

1// レシーバー 2 3public class StateChanageReceiver extends BroadcastReceiver { 4 @Override 5 public void onReceive(Context context, Intent intent) { 6 NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 7 if(networkInfo != null){ 8 if (networkInfo.getState() == NetworkInfo.State.CONNECTED) { 9 // ★ 10 } 11 } 12 }
ozwind918👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mix-peach

2019/02/21 05:05

==ではなく、equalsに変えてみるとか・・??(javaは記憶がおぼろげです;;)
ms90

2019/02/21 06:08

ご回答ありがとうございます。 ただ、ご指摘いただいたNetworkInfo.State はenumなので == で問題ないと思われます。
mix-peach

2019/02/21 07:17

なるほど・・・!ぐぐって出てきた参考ページでは、equalsかswitchで検証していたので、==だと結果が変わる可能性があるのかな?と思ってのコメントでした。。。検討違いを失礼しました!(。v_v)ペコ
ms90

2019/02/25 03:22

とんでもないです。コーディングミスの可能性もありますので。 ご回答ありがとうございました。
guest

回答1

0

ベストアンサー

Android9 の XperiaXZ3 でも 2回通知が来ています.

IntentFilter に android.net.conn.CONNECTIVITY_CHANGE を追加し

java

1ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 2for (Network network : cm.getAllNetworks()) { 3 Log.d("StateChanageReceiver.onReceive", "***** network=" + network + " *****"); 4 Log.d("StateChanageReceiver.onReceive", "ConnectivityManager.networkInfo=" + cm.getNetworkInfo(network)); 5 Log.d("StateChanageReceiver.onReceive", "NetworkCapabilities=" + cm.getNetworkCapabilities(network)); 6}

等としてネットワークの状況を見てみましたが, 確実な所は分かりませんでした.
なんとなくでは, 全ネットワークの変化の一部として Wifi の通知も纏めて送られている形であるとか, intent に含まれる NetworkInfo の state が元は参照で, 通知送信直前に解決すると既に変化していた(=バグ?)という状況のようにも思えました.

レシーバ内で connected のフラグを持って connected 済みの CONNECTED 通知は無視するという対処療法が一番簡単かもしれません.

投稿2019/02/21 07:03

jimbe

総合スコア12543

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms90

2019/02/25 03:24

ご回答ありがとうございます。 なにか仕組みを噛まさないと難しいということがわかり助かりました。 検証もしていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問