隐式广播接收者不会打电话

时间:2018-06-02 21:07:29

标签: android broadcastreceiver android-8.0-oreo

我在网上搜索了很多时间,我不明白为什么我的自定义广播 没有工作。

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

当我重新连接并断开充电器时,我不接受它。

我这样做是为了让事情变得简单

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

1 个答案:

答案 0 :(得分:1)

来自docs

  

ACTION_BATTERY_CHANGED   广播操作:这是一个粘性广播,包含有关电池的充电状态,电平和其他信息。有关Intent内容的文档,请参阅BatteryManager。

     

只有通过使用Context.registerReceiver()显式注册它,才能通过清单中声明的​​组件来接收它。请参阅ACTION_BATTERY_LOW,ACTION_BATTERY_OKAY,ACTION_POWER_CONNECTED和ACTION_POWER_DISCONNECTED,了解发送并可通过清单接收器接收的不同电池相关广播

因此,您无法在BroadcastReceiver中使用此Manifest decalred,只能从您的上下文中明确注册。

此外,您的电源连接BroadcastReceiver似乎也是正确的。尝试将其分成另一个BroadcastReceiver,可能行动ACTION_BATTERY_CHANGED正在干扰其他行为。

这是我使用的BroadcastReceiver,我在我的应用中使用它。

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

注意:此代码适用于Android 8,其targetSdkVersion为25或更低。

在targetSdkVersion 26或更高版本中,由于背景限制,大多数BroadcastReceivers无法通过Manifest工作。以下是documentation(感谢Pawel)。所以你的IntentFilters不会工作。为了使其正常工作,您可以将targetSdkVersion下载到25或更低。