1

私はアンドロイドが初めてで、ホットスポットが変更されるたびにブロードキャストを受信するブロードキャストレシーバーを実装しようとしています:

public class HotspotChangeReceiver extends BroadcastReceiver implements Configurable {

public static boolean isEnabled = false;


@Override
public void onReceive(Context context, Intent intent) {
    //TODO handle properly
    String action = intent.getAction();
    if ("android.net.wifi.WIFI_AP_STATE_CHANGED".equals(action)) {

        Intent intent1 = new Intent();
        int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);

       // if (WifiManager.WIFI_STATE_ENABLED == state % 10) {
         if(state == 13){
            intent1.setAction("net.wecodelicious.intent.action.HOTSPOT_ENABLED");
            context.sendBroadcast(intent1);
        }
        else{
            intent1.setAction("net.wecodelicious.intent.action.HOTSPOT_DISABLED");
            context.sendBroadcast(intent1);
        }

        Toast.makeText(context, "HOTSPOT Changed ", Toast.LENGTH_LONG).show();

    }
}

public static void enable() {
    if(!isEnabled) {
        MainActivity.getMpackageManager().setComponentEnabledSetting(new ComponentName(MainActivity.getMcontext(), HotspotChangeReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
        isEnabled = true;
    }
}


public static void disable() {
    if(isEnabled) {
        MainActivity.getMpackageManager().setComponentEnabledSetting(new ComponentName(MainActivity.getMcontext(), HotspotChangeReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        isEnabled = false;
    }
}
}

また、カスタムブロードキャストを受信するためのクラスをフォローしています:

public class HotspotEnabledReceiver extends BroadcastReceiver implements Configurable {
public static boolean isEnabled = false;

@Override
public void onReceive(Context context, Intent intent) {
    //TODO handle properly
    if("net.wecodelicious.intent.action.HOTSPOT_ENABLED".equals(intent.getAction())) {
        Toast.makeText(context, "Hotspot Enabled ", Toast.LENGTH_LONG).show();
    }
}

public static void enable() {
    if(!isEnabled) {
        HotspotChangeReceiver.enable();
        MainActivity.getMpackageManager().setComponentEnabledSetting(new ComponentName(MainActivity.getMcontext(), HotspotEnabledReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
        isEnabled = true;
    }
}


public static void disable() {
    if(isEnabled) {
        HotspotChangeReceiver.disable();
        MainActivity.getMpackageManager().setComponentEnabledSetting(new ComponentName(MainActivity.getMcontext(), HotspotEnabledReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        isEnabled = false;
    }
}
}

ホットスポットが無効になっているときのブロードキャストレシーバーは次のとおりです。

public class HotspotDisabledReceiver extends BroadcastReceiver implements Configurable {
public static boolean isEnabled = false;

@Override
public void onReceive(Context context, Intent intent) {
    //TODO handle properly
    if("net.wecodelicious.intent.action.HOTSPOT_DISABLED".equals(intent.getAction())) {
        Toast.makeText(context, "Hotspot Disabled ", Toast.LENGTH_LONG).show();
    }
}

public static void enable() {
    if(!isEnabled) {
        HotspotChangeReceiver.enable();
        MainActivity.getMpackageManager().setComponentEnabledSetting(new ComponentName(MainActivity.getMcontext(), HotspotDisabledReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
        isEnabled = true;
    }
}


public static void disable() {
    if(isEnabled) {
        HotspotChangeReceiver.disable();
        MainActivity.getMpackageManager().setComponentEnabledSetting(new ComponentName(MainActivity.getMcontext(), HotspotDisabledReceiver.class), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
        isEnabled = false;
    }
}
}

また、次のように ManiActivity のすべてのレシーバー コンポーネントを有効にしています。

public class MainActivity extends AppCompatActivity {
public static boolean isF = true;


@Override
protected void onCreate(Bundle savedInstanceState) {
...
enableall();
}

public static void enableall(){


    if(isF) {
        HotspotChangeReceiver.enable();
        HotspotEnabledReceiver.enable();
        HotspotDisabledReceiver.enable();
        isF=false;
    }
}

それらをマニフェストファイルに登録しました:

<receiver android:name=".HotspotChangeReceiver" android:enabled="false">
        <intent-filter>
            <action android:name="android.net.wifi.WIFI_AP_STATE_CHANGED"/>
        </intent-filter>
    </receiver>
    <receiver android:name=".HotspotEnabledReceiver" android:enabled="false">
        <intent-filter>
            <action android:name="net.wecodelicious.intent.action.HOTSPOT_ENABLED"/>
        </intent-filter>
    </receiver>
    <receiver android:name=".HotspotDisabledReceiver" android:enabled="false">
        <intent-filter>
            <action android:name="net.wecodelicious.intent.action.HOTSPOT_DISABLED"/>
        </intent-filter>
    </receiver>

しかし、アプリを実行してホットスポットをオンにすると、トーストは次の順序で表示されます。

Hotspot Changed
Hotspot Disabled
Hotspot Enabled

また、ホットスポットをオフにすると、次のトーストが表示されます。

Hotspot Changed
Hotspot Disabled
Hotspot Changed
Hotspot Disabled

誰かが奇妙な動作を認識し、それに対する迅速な解決策を持っていることを願っています.解決策を見つけようとしましたが、解決策を見つけることができませんでした.

4

1 に答える 1

0

有効化と無効化は同時に状態変化ですね。Enable と Disable を登録するか、State Change だけを登録します。

于 2016-09-29T19:52:31.077 に答える