Search code examples
androidbroadcastreceiverandroid-8.0-oreo

Implicit Broadcast Reciever isn't calling


I searched the web for alot of time and I don't understand why my custom broadcast isn't working.

<receiver
        android:name=".myservice.MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
            <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            <action android:name="android.intent.action.BATTERY_CHANGED"/>
            <action android:name="android.intent.action.SCREEN_ON" />
            <action android:name="android.intent.action.SCREEN_OFF" />
        </intent-filter>
</receiver>

I don't it not recieve when I reconnet and disconnect the charger.

I did this for making thing simpale

public class MyReceiver extends BroadcastReceiver
{
   @Override
   public void onReceive(Context context, Intent intent)
   {
       Toast.makeText(context,"Battery", Toast.LENGTH_SHORT).show();
       Log.i("Recive", "Yes");
   }
}

Solution

  • From docs:

    ACTION_BATTERY_CHANGED Broadcast Action: This is a sticky broadcast containing the charging state, level, and other information about the battery. See BatteryManager for documentation on the contents of the Intent.

    You cannot receive this through components declared in manifests, only by explicitly registering for it with Context.registerReceiver(). See ACTION_BATTERY_LOW, ACTION_BATTERY_OKAY, ACTION_POWER_CONNECTED, and ACTION_POWER_DISCONNECTED for distinct battery-related broadcasts that are sent and can be received through manifest receivers

    So, you cannot use this BroadcastReceiver decalred in Manifest, only registering explicitly from your context.

    Also, your power connection BroadcastReceiver seems correct. Try to separate it into another BroadcastReceiver, maybe action ACTION_BATTERY_CHANGED is interfering with other actions.

    This is my declared BroadcastReceiver which I use and it's working in my app.

    <receiver android:name=".PowerConnectionBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
            </intent-filter>
    </receiver>
    

    PowerConnectionBroadcastReceiver

    public class PowerConnectionBroadcastReceiver extends BroadcastReceiver {
      private static final String TAG = "PowerRcvr";
      @Override
      public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_POWER_CONNECTED)) {
          Log.d(TAG, "Device is charging");
        } else if (action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
          Log.d(TAG, "Device is NOT charging");
        } else {
          Log.d(TAG, "Unable to check if device is charging or not");
        }
      }
    }
    

    NOTE: This code is working on Android 8 with targetSdkVersion 25 or lower.

    In targetSdkVersion 26 or higher most of BroadcastReceivers doesn't work through Manifest due to background limitations. Here are documentation (thanks to Pawel) about that. So your IntentFilters wont work. To keep it working you can download your targetSdkVersion to 25 or lower.