1

Я новичок в андроид и я пытаюсь реализовать широковещательный приемник, который будет получать радиопередачу всякий раз, когда точка доступа меняется:Android BroadcastReceiver называется несколько раз

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; 
    } 
} 
} 

и BroadcastReceiver, когда точка доступа отключена следующая:

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 

Я надеюсь, что кто-то узнает странное поведение и имеет быстрое решение для него. Я попытался найти решение, но не смог найти ни одного. Любая помощь будет оценена.

+0

Попробуйте следить за состоянием Wi-Fi (отладчик или протоколирование), очевидно, это более чем одно простое изменение состояния. – Zharf

ответ

0

Когда вы включаете и выключаете, это изменение состояния в то же время не так. Я бы либо зарегистрировал Enable, и Disable, либо просто State Change только по себе.

 Смежные вопросы

  • Нет связанных вопросов^_^