4

私の目標は、wi-fi 状態を変更したときにログを印刷することです。

以下のコードを使用します。

MainActivity.java (メイン アクティビティ)

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService(new Intent(this,WiFiService.class));
    }
    @Override
    protected void onStart() 
    {
        super.onStart();
        Log.d("Start Service", "Start Service");;
        startService(new Intent(this,WiFiService.class));
    }
}

WiFiService.java (サービス)

public class WiFiService extends Service
{

    WiFiBroadCasetReceiver brod;
    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        brod=new WiFiBroadCasetReceiver();
        this.registerReceiver(brod, new IntentFilter(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
    }

    @Override
    public void onDestroy() 
    {
        super.onDestroy();
    }
}

WiFiBroadCasetReceiver.java (ブロードキャストレシーバー)

public class WiFiBroadCasetReceiver extends BroadcastReceiver
{

    @Override
    public void onReceive(Context arg0, Intent arg1) 
    {
        Log.d("on receiver", "receiver");
    }

}

AndroidManifest.xml

<application>
        ........
        ........

        <receiver android:name=".WiFiBroadCasetReceiver" >
            <intent-filter>
                <action android:name="android.net.wifi.supplicant.STATE_CHANGE" />
            </intent-filter>
        </receiver>
</application>

問題 :

上記のコードは、Android 4.0 以下のバージョンで正常に動作します。wi-fi の状態を変更すると、ブロードキャスト レシーバーがランダムに呼び出されます。したがって、ログはランダムに出力されます。私は一度だけ必要です。すべてのAndroidバージョンはAndroid 4.1.0のままで正常に動作します。以上のバージョン(Jelly Bean)。私はandroid.net.wifi.WIFI_STATE_CHANGEDを​​使用しています。しかし、それでも同じエラーが発生します。

4

2 に答える 2

5

あなたの質問では、いくつかの点に対処する必要があります。

まず、「android.net.wifi.supplicant.STATE_CHANGE」と「android.net.wifi.WIFI_STATE_CHANGED」の状態を混同している可能性があります。そして、あなたが本当に欲しいのは後者だと思います。ソースコードのコメントを参照してください。

/**
 * Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
 * enabling, disabling, or unknown. One extra provides this state as an int.
 * Another extra provides the previous state, if available.
 *
 * @see #EXTRA_WIFI_STATE
 * @see #EXTRA_PREVIOUS_WIFI_STATE
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_STATE_CHANGED_ACTION =
    "android.net.wifi.WIFI_STATE_CHANGED";

/**
 * Broadcast intent action indicating that a connection to the supplicant has
 * been established (and it is now possible
 * to perform Wi-Fi operations) or the connection to the supplicant has been
 * lost. One extra provides the connection state as a boolean, where {@code true}
 * means CONNECTED.
 * @see #EXTRA_SUPPLICANT_CONNECTED
 */
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION =
    "android.net.wifi.supplicant.CONNECTION_CHANGE";

第二に、なぜ複数のブロードキャスト コールバックを受け取ったのでしょうか? しかも回数はランダム?コードを注意深く確認する必要があると思います:

1. You start the service twice, once in Activity.onCreate() and once in Activity.onStart()
2. You register your broadcast receiver twice, once in AndroidManifest.xml and once in Service.onStart()
3. The most important thing is that you will create a new instance of your broadcast receiver instance in your Service.onStart(). That is to say, whenever your service is start, a new receiver will be created and registered. And looking back on 1, you see every time you bring you Activity back will call the service to start again.

したがって、コールバックのランダムな時間は、コードが悪いためです。すべてのブロードキャスト レジスタを削除して、AndroidManifest.xml に 1 つだけ残してください。

最後に、後で JellyBean で動作させることができないのはなぜですか? これは、正しいアクションを指定していないためだと思います。「android.net.wifi.supplicant.STATE_CHANGE」の代わりに「android.net.wifi.WIFI_STATE_CHANGED」を試して、もう一度お試しください。

于 2013-08-13T11:19:17.593 に答える